การแทนที่อินสแตนซ์ของอักขระในสตริง


120

รหัสง่ายๆที่พยายามแทนที่อัฒภาค (ที่ตำแหน่งที่ระบุไว้) ด้วยเครื่องหมายโคลอนใช้ไม่ได้:

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

มันให้ข้อผิดพลาด

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

ฉันจะแก้ไขสิ่งนี้เพื่อแทนที่อัฒภาคด้วยเครื่องหมายจุดคู่ได้อย่างไร การใช้การแทนที่ไม่ได้ผลเนื่องจากฟังก์ชันนั้นไม่มีดัชนี - อาจมีอัฒภาคบางตัวที่ฉันไม่ต้องการแทนที่

ตัวอย่าง

ในสตริงฉันอาจมีเครื่องหมายอัฒภาคจำนวนเท่าใดก็ได้เช่น "Hei der !; Hello there; !;"

ฉันรู้ว่าฉันต้องการแทนที่อันไหน (ฉันมีดัชนีอยู่ในสตริง) การใช้การแทนที่ไม่ได้ผลเนื่องจากฉันไม่สามารถใช้ดัชนีกับมันได้


1
คุณรู้จักstr.replace()BIF หรือไม่?
LarsVegas

2
ใช่ตามที่ฉันอธิบายไว้ในคำถาม ฉันยังอธิบายว่าเหตุใดจึงไม่ได้ผลสำหรับฉัน
Unfun Cat

ใช้str.find() แทนเพื่อหาตำแหน่งของอัฒภาคจากนั้นใช้การแบ่งส่วนเพื่อแยกสตริงย่อย
LarsVegas

1
คุณต้องมีความเฉพาะเจาะจงมากขึ้นในสิ่งที่ถือเป็นการทดแทนที่ถูกต้อง รหัสที่ไม่ทำงานของคุณจะแทนที่เครื่องหมายอัฒภาคทั้งหมดในสตริงหากไม่สามารถเปลี่ยนแปลงได้
Martijn Pieters

1
@TheUnfunCat: คุณได้รับดัชนีตั้งแต่แรกเป็นอย่างไร? อาจมีทางออกที่ดีกว่าสำหรับทุกสิ่ง (เช่น regexes)
nneonneo

คำตอบ:


207

สตริงใน python ไม่เปลี่ยนรูปดังนั้นคุณจึงไม่สามารถถือว่าเป็นรายการและกำหนดให้กับดัชนีได้

ใช้.replace()แทน:

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

หากคุณต้องการแทนที่เฉพาะอัฒภาคบางตัวคุณจะต้องเจาะจงมากขึ้น คุณสามารถใช้การแบ่งส่วนเพื่อแยกส่วนของสตริงเพื่อแทนที่ใน:

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

ซึ่งจะแทนที่เซมิโคลอนทั้งหมดใน 10 อักขระแรกของสตริง


สิ่งนี้ใช้ได้กับอักขระ Unicode หรือไม่ ดูเหมือนจะไม่ได้ผลสำหรับฉัน
Steven2163712

@ Steven2163712: ข้อความทั้งหมดเป็น Unicode ใช่มันใช้งานได้ดีกับทุกตัวอักษร หากไม่มีตัวอย่างที่เป็นรูปธรรมฉันไม่สามารถช่วยคุณแก้ไขปัญหาเฉพาะของคุณได้
Martijn Pieters

62

คุณสามารถทำสิ่งต่อไปนี้เพื่อแทนที่ถ่านใด ๆ ด้วยอักขระตามลำดับในดัชนีที่กำหนดหากคุณไม่ต้องการใช้ .replace()

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

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

o/p: pythin

7
นี่ควรเป็นคำตอบที่ได้รับการยอมรับตอบคำถามโดยตรง นี่เป็นวิธีที่ง่ายที่สุดที่ฉันเคยพบมา
Flare Cat

24

เปลี่ยนสตริงเป็นรายการ จากนั้นคุณสามารถเปลี่ยนตัวละครทีละตัว จากนั้นคุณสามารถนำกลับมาใช้ร่วมกับ.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

หากคุณต้องการแทนที่อัฒภาคเดี่ยว:

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

ยังไม่ได้ทดสอบเลย


3
วิธีนี้จะใช้งานได้ (+1) แต่ค่อนข้างไม่มีประสิทธิภาพเนื่องจากคุณกำลังสร้างสตริงใหม่ทุกครั้งที่คุณพบเครื่องหมาย ";"
inspectorG4dget

@ inspectorG4dget คุณพูดถูกมันเป็นวิธีแก้ปัญหาที่รวดเร็วและสกปรกเพียงครั้งเดียว
วิก

ที่จริงแล้ว @ inspectorG4dget คำตอบที่ได้รับการยอมรับไม่ประสบปัญหาเดียวกันใช่หรือไม่
วิก

2
line.replace(src,dst)ไม่. line[:10].replace(src,dst) + line[10:]ทำได้ แต่มีความรุนแรงน้อยกว่ามาก สมมติว่าline = ';'*12. โซลูชันของคุณจะสร้างสตริงใหม่ 12 ครั้ง โซลูชันที่ยอมรับจะทำครั้งเดียว
inspectorG4dget

3

สิ่งนี้ควรครอบคลุมกรณีทั่วไปมากกว่าเล็กน้อย แต่คุณควรปรับแต่งได้ตามวัตถุประสงค์ของคุณ

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)

หวังว่านี่จะช่วยได้


3

คุณไม่สามารถกำหนดค่าให้กับอักขระในสตริงได้ ใช้วิธีนี้เพื่อแทนที่ค่าของอักขระเฉพาะ:

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

เอาต์พุต: ใน * ia

นอกจากนี้หากคุณต้องการแทนที่ say * สำหรับการเกิดขึ้นทั้งหมดของอักขระตัวแรกยกเว้นอักขระตัวแรกเช่น สตริง = เอาท์พุทพูดพล่าม = ba ** le

รหัส:

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

1

หากคุณกำลังแทนที่ด้วยค่าดัชนีที่ระบุในตัวแปร 'n' ให้ลองทำตามด้านล่างนี้:

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

1
ปัญหาในการแก้ปัญหานี้คือมันจะแทนที่การเกิดขึ้นทั้งหมดของอักขระที่ตำแหน่ง n และผู้ถามต้องการแทนที่เหตุการณ์เฉพาะนั้นเท่านั้น
shivram.ss

ทางออกที่ไม่ดี!
Erhard Dinhobl

1

แล้วสิ่งนี้ล่ะ:

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

ในการใช้เมธอด. replace () บนสตริงอย่างมีประสิทธิภาพโดยไม่ต้องสร้างรายการแยกต่างหากตัวอย่างเช่นดูชื่อผู้ใช้รายการที่มีสตริงที่มีช่องว่างสีขาวบางส่วนเราต้องการแทนที่ช่องว่างด้วยเครื่องหมายขีดล่างในสตริงชื่อผู้ใช้แต่ละรายการ

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

ในการแทนที่ช่องว่างสีขาวในแต่ละชื่อผู้ใช้ให้พิจารณาใช้ฟังก์ชัน range ใน python

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

print(usernames)

0

ในการแทนที่อักขระที่ดัชนีเฉพาะฟังก์ชันจะเป็นดังนี้:

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

โดยที่ s คือสตริง n คือดัชนีและ c คืออักขระ


0

ฉันเขียนวิธีนี้เพื่อแทนที่อักขระหรือแทนที่สตริงในอินสแตนซ์เฉพาะ อินสแตนซ์เริ่มต้นที่ 0 (สามารถเปลี่ยนเป็น 1 ได้อย่างง่ายดายหากคุณเปลี่ยนอาร์กิวเมนต์ inst ที่เป็นทางเลือกเป็น 1 และตัวแปร test_instance เป็น 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

คุณสามารถทำได้:

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"]

ชื่อผู้ใช้ = []

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

o, p Joey_Tribbiani Monica_Geller Chandler_Bing Phoebe_Buffay


1
ขอบคุณมูฮัมหมัดฉันเป็นมือใหม่ฉันจะทำให้ดีที่สุด
Kasem007
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.