Thay thế các bản sao của một ký tự trong một chuỗi


119

Mã đơn giản này chỉ cố gắng thay thế dấu chấm phẩy (tại vị trí do i chỉ định) bằng dấu hai chấm không hoạt động:

for i in range(0,len(line)):
     if (line[i]==";" and i in rightindexarray):
         line[i]=":"

Nó đưa ra lỗi

line[i]=":"
TypeError: 'str' object does not support item assignment

Làm cách nào để giải quyết vấn đề này để thay thế dấu chấm phẩy bằng dấu hai chấm? Việc sử dụng thay thế không hoạt động vì hàm đó không có chỉ mục - có thể có một số dấu chấm phẩy tôi không muốn thay thế.

Thí dụ

Trong chuỗi, tôi có thể có bất kỳ số lượng dấu chấm phẩy nào, ví dụ: "Hei der!; Hello there;!;"

Tôi biết tôi muốn thay thế cái nào (tôi có chỉ mục của chúng trong chuỗi). Sử dụng thay thế không hoạt động vì tôi không thể sử dụng chỉ mục với nó.


1
Bạn có biết str.replace()BIF?
LarsVegas

2
Có, như tôi đã giải thích trong câu hỏi. Tôi cũng giải thích tại sao điều đó không hiệu quả với tôi.
The Unfun Cat

str.find() Thay vào đó, hãy sử dụng để tìm vị trí của dấu chấm phẩy, sau đó sử dụng phép cắt để trích xuất chuỗi con.
LarsVegas

1
Khi đó, bạn cần phải cụ thể hơn về những gì cấu thành sự thay thế hợp lệ; mã không hoạt động của bạn sẽ thay thế tất cả các dấu chấm phẩy trong chuỗi nếu nó có thể thay đổi được.
Martijn Pieters

1
@TheUnfunCat: Làm thế nào để bạn có được các chỉ số ngay từ đầu? Có thể có một giải pháp tốt hơn cho toàn bộ điều (ví dụ regexes)
nneonneo

Câu trả lời:


206

Các chuỗi trong python là bất biến, vì vậy bạn không thể coi chúng như một danh sách và gán cho các chỉ mục.

Sử dụng .replace()thay thế:

line = line.replace(';', ':')

Nếu bạn chỉ cần thay thế một số dấu chấm phẩy nhất định , bạn sẽ cần phải cụ thể hơn. Bạn có thể sử dụng tính năng cắt để tách phần của chuỗi để thay thế trong:

line = line[:10].replace(';', ':') + line[10:]

Điều đó sẽ thay thế tất cả dấu chấm phẩy trong 10 ký tự đầu tiên của chuỗi.


Điều này có hoạt động với các ký tự unicode không? Nó dường như không hiệu quả với tôi.
Steven2163712

@ Steven2163712: Tất cả văn bản đều là Unicode, vì vậy có, điều này hoạt động tốt với tất cả các ký tự. Nếu không có ví dụ cụ thể, tôi không thể giúp bạn khắc phục sự cố cụ thể của mình.
Martijn Pieters

62

Bạn có thể làm như dưới đây, để thay thế bất kỳ ký tự nào bằng một ký tự tương ứng tại một chỉ mục nhất định, nếu bạn không muốn sử dụng .replace()

word = 'python'
index = 4
char = 'i'

word = word[:index] + char + word[index + 1:]
print word

o/p: pythin

7
Đây phải là câu trả lời được chấp nhận, trả lời trực tiếp câu hỏi. Đây là phương pháp dễ nhất mà tôi tìm thấy cho đến nay.
Flare Cat

24

Biến chuỗi thành một danh sách; thì bạn có thể thay đổi các ký tự riêng lẻ. Sau đó, bạn có thể đặt nó trở lại cùng với .join:

s = 'a;b;c;d'
slist = list(s)
for i, c in enumerate(slist):
    if slist[i] == ';' and 0 <= i <= 3: # only replaces semicolons in the first part of the text
        slist[i] = ':'
s = ''.join(slist)
print s # prints a:b:c;d

6

Nếu bạn muốn thay thế một dấu chấm phẩy:

for i in range(0,len(line)):
 if (line[i]==";"):
     line = line[:i] + ":" + line[i+1:]

Havent đã thử nghiệm nó.


3
Điều này sẽ hoạt động (+1), nhưng khá kém hiệu quả, vì bạn đang tạo một chuỗi mới mỗi khi bạn gặp phải dấu ';'
thanh

@ ins InspectorG4dget, bạn nói đúng, đây là một giải pháp nhanh chóng và bẩn thỉu - một lần duy nhất -.
Vic

Trên thực tế, @ ins InspectorG4dget, câu trả lời được chấp nhận có bị cùng một vấn đề không?
Vic

2
line.replace(src,dst)không làm. line[:10].replace(src,dst) + line[10:]có, nhưng mức độ nghiêm trọng ít hơn nhiều. Giả sử line = ';'*12. Giải pháp của bạn sẽ xây dựng một chuỗi mới 12 lần. Giải pháp được chấp nhận sẽ làm như vậy một lần.
thanh

3

Điều này sẽ bao gồm một trường hợp chung chung hơn một chút, nhưng bạn có thể tùy chỉnh nó cho mục đích của mình

def selectiveReplace(myStr):
    answer = []
    for index,char in enumerate(myStr):
        if char == ';':
            if index%2 == 1: # replace ';' in even indices with ":"
                answer.append(":")
            else:
                answer.append("!") # replace ';' in odd indices with "!"
        else:
            answer.append(char)
    return ''.join(answer)

Hi vọng điêu nay co ich


3

Bạn không thể chỉ định giá trị cho một ký tự trong chuỗi. Sử dụng phương pháp này để thay thế giá trị của một ký tự cụ thể:

name = "India"
result=name .replace("d",'*')

Đầu ra: In * ia

Ngoài ra, nếu bạn muốn thay thế say * cho tất cả các lần xuất hiện của ký tự đầu tiên ngoại trừ ký tự đầu tiên, ví dụ: string = đầu ra lảm nhảm = ba ** le

Mã:

name = "babble"
front= name [0:1]
fromSecondCharacter = name [1:]
back=fromSecondCharacter.replace(front,'*')
return front+back

1

Nếu bạn đang thay thế bằng một giá trị chỉ mục được chỉ định trong biến 'n', thì hãy thử cách dưới đây:

def missing_char(str, n):
 str=str.replace(str[n],":")
 return str

1
Vấn đề với giải pháp này là nó sẽ thay thế tất cả các lần xuất hiện của các nhân vật ở vị trí n và hỏi chỉ muốn thay thế mà cụ thể xảy ra
shivram.ss

Chính xác, giải pháp kém!
Erhard Dinhobl

1

Còn cái này thì sao:

sentence = 'After 1500 years of that thinking surpressed'

sentence = sentence.lower()

def removeLetter(text,char):

    result = ''
    for c in text:
        if c != char:
            result += c
    return text.replace(char,'*')
text = removeLetter(sentence,'a')

1

để sử dụng phương thức .replace () hiệu quả trên chuỗi mà không cần tạo danh sách riêng, ví dụ, hãy xem tên người dùng trong danh sách chứa chuỗi với một số khoảng trắng, chúng tôi muốn thay thế khoảng trắng bằng dấu gạch dưới trong mỗi chuỗi tên người dùng.

usernames = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]

để thay thế các khoảng trắng trong mỗi tên người dùng, hãy xem xét sử dụng hàm phạm vi trong python.

for i in range(len(usernames)):
    usernames[i] = usernames[i].lower().replace(" ", "_")

print(usernames)

0

Để thay thế một ký tự tại một chỉ mục cụ thể, hàm như sau:

def replace_char(s , n , c):
    n-=1
    s = s[0:n] + s[n:n+1].replace(s[n] , c) + s[n+1:]
    return s

trong đó s là một chuỗi, n là chỉ số và c là một ký tự.


0

Tôi đã viết phương thức này để thay thế các ký tự hoặc thay thế chuỗi tại một trường hợp cụ thể. các phiên bản bắt đầu từ 0 (điều này có thể dễ dàng được thay đổi thành 1 nếu bạn thay đổi đối số inst tùy chọn thành 1 và biến test_instance thành 1.

def replace_instance(some_word, str_to_replace, new_str='', inst=0):
    return_word = ''
    char_index, test_instance = 0, 0
    while char_index < len(some_word):
        test_str = some_word[char_index: char_index + len(str_to_replace)]
        if test_str == str_to_replace:
            if test_instance == inst:
                return_word = some_word[:char_index] + new_str + some_word[char_index + len(str_to_replace):]
                break
            else:
                test_instance += 1
        char_index += 1
    return return_word

0

Bạn có thể làm được việc này:

string = "this; is a; sample; ; python code;!;" #your desire string
result = ""
for i in range(len(string)):
    s = string[i]
    if (s == ";" and i in [4, 18, 20]): #insert your desire list
        s = ":"
    result = result + s
print(result)

0

names = ["Joey Tribbiani", "Monica Geller", "Chandler Bing", "Phoebe Buffay"]

tên người dùng = []

for i in names:
    if " " in i:
        i = i.replace(" ", "_")
    print(i)

o, p Joey_Tribbiani Monica_Geller Chandler_Bing Phoebe_Buffay


1
Cảm ơn, Muhammad Tôi là người mới bắt đầu, tôi sẽ cố gắng hết sức mình.
Kasem007
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.