Replace in python3

mọi người ơi, giờ mình có một vấn đề thế này.

Ví dụ mình có từ ‘nhanh’, mình có một cái map biến ‘nh’ thành ‘hn’

mình muốn từ này có thể biến đổi thành:
hnanh, nhahn hoặc hnahn.

Mình có tìm thấy hàm replace trong python thì nó lại replace tất cá các khả năng xẩy ra. Không phù hợp với mục đích của mình.

Giờ mình chưa nghĩ ra, mọi người giúp mình với.

Vậy thì replace trong substring thôi :wink:

str = "lalala";
pos1 = str.find("l");
pos2 = str[pos1+1:].find("l");
print(str[:pos1+1]+str[pos2:].replace("l", "L", 1)) 
# laLala

Hoặc là split ra xong ghép lại …

str = "nhanha";
strs = str.split("nh", -1);
print(strs)
# ['', 'a', 'a'] 
4 Likes

có cách nào khác hơn không nhỉ, vì bảng map của mình có nhiều ký tự. mà dùng cách thủ công là tìm xem trong từ đấy những kí tự mong muốn có trong từ xong replace thì code rối lắm

Mà yêu cầu này hơi lạ vì output sẽ tăng theo hàm mũ :slight_smile:

3 Likes

Không hiểu yêu cầu của bạn lắm. Bạn thử dùng regex hoặc sinh hoán vị xem

3 Likes

Cách tiện nhất thì chắc là dùng regex để tìm những từ chứ ký tự mà bạn cần repalce.

Nếu bạn không quen dùng regex, thì python có hàm startswith()endswith() để tìm những từ cần thay thế, thay cho việc dùng regex.

Cứ cho hết vào loops và xử lý từng thằng một thôi. Nhưng sẽ hơi chậm và nhìn không pro lắm.

4 Likes

Mình dùng cái re.match có thể lấy được position của nó (mình vừa nghĩ ra). Còn tại sao hàm mũ thì ý tưởng của bạn là gì

1 Like

hai hàm trên chỉ tìm được kí tự nằm đầu và năm cuối. Hai hàm kia hạn chế quá, mình cũng đang tìm hiểu regex

Kiểu 1 string có thể chưa nhiều kí tự yêu cầu và mình muốn thay thế nó bằng một kí tự khác, với số lương ký tự thay thế không cố định

Bạn có thể làm rõ đề bài không?
có phải như thế này?

# Tất cả ký tự thay thế cho 'a'
replace_for_char_a = [b, c, d, e, f]

# Từ cần thay thế
word = "aaaa"

# Output:
# "aaab"
# "aaac"
# "aabc"
# ...v.v.
3 Likes

chính xác rồi bạn. …

Thêm nữa, 1 string sẽ chỉ thay thế 1 ký tự (hoặc 1 substring) 1 lần, hay sẽ thay thế nhiều ký tự khác nhau 1 lần, vd: “ab” có “a” => “c” và “b” => “d” nên “ab” => “cd”

2 Likes

Ý bạn ấy là output sinh ra quá nhiều. Như đề bài của bạn:

Ví dụ:

s = "a" * n
replacer = ["b", "c", ..., "z"]
# thay mỗi kí tự a bằng 1 số kí tự trong replacer

Output là

"a...a[b-z]"
"a...[b-z]a"
...
"[b-z]a..a"

Đây mới chỉ là thay 1 lần mà đã có 25n xâu. Tiếp tục thay 2 kí tự:

"a...[b-z][b-z]"
"a...[b-z]a[b-z]"
...

Đây có xâu output.

Tiếp tục làm vậy nhiều lần, số output có là (đây chính là hàm mũ).

Nếu n = 10 thì đã ra đến ~1e14 kết quả rồi :scream:


Tổng quát, coi |replacer| là độ dài của mảng replacer, n là độ dài string cần replace:

6 Likes

có thể nhiều lần, cái ví dụ nhanh trên kia minh trình bày rồi mà

nhanh - 1 lần - hnanh
- 1 lần - nhahn
- nhiều lần - hnahn

do ràng buộc về đầu vào và số kí tự chọn để thay và nó được thay thế bằng một số kí tự khác cũng hạn chế nên không sợ nhiều.

Mình rất thích những chứng minh rõ ràng và cụ thể như vậy, cám ơn bạn.

Mình hỏi cho rõ đề bài thôi, vì đề bài rắc rối sẵn rồi, hỏi xem nó có rắc rối hơn không :sweat_smile:

# Lười viết hàm helper, lười tối ưu, lười mọi thứ nên print ra thôi :V ^^


def replace(pre_str, post_str, target, directory):
    tar_len = len(target);
    pos = post_str.find(target);
    if pos == -1:
        print(pre_str + post_str);
    else:
        for rep in directory:
            replace(pre_str+post_str[:pos] + rep,
                    post_str[pos+tar_len:],
                    target,
                    directory);
        replace(pre_str+post_str[:pos] + target,
                post_str[pos+tar_len:],
                target,
                directory)

        # Xử lý trường hợp mẫu phía dưới 
        for i in range(1, tar_len):
            if post_str[pos+i:pos+i+tar_len] == target:
                pos+=i;
                for rep in directory:
                    replace(pre_str+post_str[:pos] + rep,
                            post_str[pos+tar_len:],
                            target,
                            directory);

replace("", "aaaa", "aa", ["bb"])
7 Likes

Cám ơn bạn vì api này, thật sự mình tưởng thư viện có, cơ mà phải bạn code thế này thì tốt quá, mình chưa check được xem có ngoại lệ nào không

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?