วิธีการลบอักขระจากสตริงโดยใช้ Python


458

มีสตริงตัวอย่างเช่น EXAMPLE.

ฉันจะลบตัวอักษรกลางเช่นMจากมันได้อย่างไร ฉันไม่ต้องการรหัส ฉันอยากจะรู้:

  • สตริงใน Python สิ้นสุดด้วยอักขระพิเศษหรือไม่?
  • วิธีไหนดีกว่า - เลื่อนทุกอย่างจากขวาไปซ้ายเริ่มต้นจากตัวอักษรกลางหรือการสร้างสตริงใหม่และไม่คัดลอกอักขระกลาง

ตัวอย่างบางส่วนjournaldev.com/23674/python-remove-character-from-string
Josh

คำตอบ:


639

ใน Python สตริงจะไม่เปลี่ยนรูปดังนั้นคุณต้องสร้างสตริงใหม่ คุณมีตัวเลือกไม่กี่วิธีในการสร้างสตริงใหม่ หากคุณต้องการลบ 'M' ไม่ว่าจะปรากฏที่ใด:

newstr = oldstr.replace("M", "")

หากคุณต้องการลบตัวอักษรกลาง:

midlen = len(oldstr)/2   # //2 in python 3
newstr = oldstr[:midlen] + oldstr[midlen+1:]

คุณถามว่าสตริงลงท้ายด้วยอักขระพิเศษหรือไม่ ไม่คุณคิดว่าเป็นโปรแกรมเมอร์ซี ใน Python สตริงจะถูกเก็บไว้ด้วยความยาวดังนั้นค่าไบต์ใด ๆ รวมถึง\0สามารถปรากฏในสตริง


16
ระบุว่าผู้ถามเป็นแบรนด์ใหม่สำหรับงูใหญ่มันอาจจะคุ้มค่าที่จะสังเกตว่าในขณะที่ในรุ่น 2.X python ผู้ประกอบการ "/" จะคืนค่าจำนวนเต็ม (ตัดเป็นศูนย์) ในเวอร์ชัน 3.X คุณควรใช้ "//" แทน. บรรทัดfrom __future__ import divisionที่จุดเริ่มต้นของสคริปต์ของคุณจะทำให้งูหลามรุ่น 2.X ทำตัวเหมือนเวอร์ชัน 3.X
Michael Dunn

1
โปรดทราบว่าหาก "M" เป็นเพียงเนื้อหาของบรรทัด "" จะทิ้งบรรทัดว่างไว้ข้างหลัง
8bitjunkie

1
@ 7SpecialGems มันขึ้นอยู่กับสิ่งที่คุณทำกับสายนี้ สตริงว่างเช่น""ไม่ได้หมายถึงบรรทัดว่าง หากคุณใส่ไว้ในรายการและเข้าร่วมกับการขึ้นบรรทัดใหม่มันจะสร้างบรรทัดว่าง แต่มีสถานที่อื่นอีกมากมายที่คุณอาจใช้สตริงว่างที่จะไม่ทำเช่นนั้น
Ned Batchelder

68

นี่อาจเป็นวิธีที่ดีที่สุด:

original = "EXAMPLE"
removed = original.replace("M", "")

ไม่ต้องกังวลกับการขยับตัวและเช่น รหัส Python ส่วนใหญ่เกิดขึ้นในระดับที่สูงกว่าของ abstraction


6
Mอาจไม่ซ้ำกัน ในกรณีนี้สิ่งนี้จะแทนที่ทั้งหมดMใช่มั้ย
Lazer

14
ใช่ที่ถูกต้อง. ถ้าคุณต้องการที่จะเปลี่ยนที่เกิดขึ้นใช้n original.replace("M", "", n)
เรียกซ้ำ

1
@ S.Lott ฉันคิดว่ามันเป็นโวหารเพื่อแนะนำการแก้ปัญหาสำหรับการเปลี่ยนเพียงตัวอย่างเดียวเท่านั้น
Dodgie

63

ในการเปลี่ยนตำแหน่งเฉพาะ:

s = s[:pos] + s[(pos+1):]

หากต้องการแทนที่อักขระเฉพาะ:

s = s.replace('M','')

18
ในขณะที่สิ่งนี้อาจใช้งานได้ฉันคิดว่าคำตอบของคุณอาจได้รับการปรับปรุงโดยอธิบายว่าเกิดอะไรขึ้นในส่วนแรกเนื่องจากการดำเนินการซับสตริงไม่จำเป็นต้องเข้าใจง่ายสำหรับมือใหม่ Python โดยไม่มีคำอธิบายใด ๆ
jloubert

ดังนั้นถ้าความยาวของ s lคือ แล้วสำหรับส่วนแรกข้อ จำกัด สำหรับ POS l-1 > pos >= 0ควรจะเป็น
Haoyu Chen

s [: pos] รับค่าสตริงย่อยจาก 0 ถึง pos-1 และ s [(pos + 1):] รับค่าสตริงย่อยจาก pos + 1 ถึงสิ้นสุด ดังนั้นมันจึงลบ s [pos] ออกจาก s
s.singh

มันไม่ได้แทนที่มันลดลง มันเป็นการดีที่จะแยกแยะการดำเนินงานโดยให้ตัวอย่างสำหรับทั้งสองกรณีการใช้งานที่สำคัญแยกจากกันโดยวิธีการเลือกตำแหน่งของพวกเขา
Alexander Stohr

28

เงื่อนไขไม่เปลี่ยนรูป แต่คุณสามารถแปลงเป็นรายการซึ่งไม่แน่นอนและแปลงรายการกลับเป็นสตริงหลังจากที่คุณเปลี่ยน

s = "this is a string"

l = list(s)  # convert to list

l[1] = ""    # "delete" letter h (the item actually still exists but is empty)
l[1:2] = []  # really delete letter h (the item is actually removed from the list)
del(l[1])    # another way to delete it

p = l.index("a")  # find position of the letter "a"
del(l[p])         # delete it

s = "".join(l)  # convert back to string

นอกจากนี้คุณยังสามารถสร้างสตริงใหม่ตามที่คนอื่น ๆ ได้แสดงโดยนำทุกอย่างยกเว้นอักขระที่คุณต้องการจากสตริงที่มีอยู่


4
ทำไมคุณไม่ลองใช้str.replaceวิธีนี้ดูล่ะ?
alichaudry

12

ฉันจะลบตัวอักษรกลางเช่น M จากมันได้อย่างไร

คุณไม่สามารถเพราะสตริงในหลามมีไม่เปลี่ยนรูป

สตริงใน Python สิ้นสุดด้วยอักขระพิเศษหรือไม่?

ไม่พวกมันคล้ายกับรายชื่อตัวละคร ความยาวของรายการกำหนดความยาวของสตริงและไม่มีอักขระทำหน้าที่เป็นเทอร์มิเนเตอร์

วิธีไหนดีกว่า - เลื่อนทุกอย่างจากขวาไปซ้ายเริ่มต้นจากตัวอักษรกลางหรือการสร้างสตริงใหม่และไม่คัดลอกอักขระกลาง

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


11

ใช้translate()วิธีการ:

>>> s = 'EXAMPLE'
>>> s.translate(None, 'M')
'EXAPLE'

3
วิธีมีการเปลี่ยนแปลง ดูเอกสารสำหรับ Python 3: translate ()สิ่งนี้แทนที่อักขระที่แตกต่างกันด้วยช่องว่าง ( Noneเพื่อลบดูเหมือนจะไม่ทำงาน):translate( str.maketrans("<>", " ") )
จัดการ

1
ที่จริงแล้ว docs ระบุสองวิธีในการลบอักขระต่าง ๆ ด้วย translate () ใน Python 3,: str.maketrans( "", "", "<>")และstr.maketrans( {"<":None,">":None })
จัดการ

3
รหัสเทียบเท่าในคำตอบกลายเป็นแบบนี้ใน python3:'EXAMPLE'.translate({ord("M"): None})
yoniLavi


6
card = random.choice(cards)
cardsLeft = cards.replace(card, '', 1)

วิธีลบอักขระหนึ่งตัวจากสตริง: นี่คือตัวอย่างที่มีสแต็กของการ์ดแสดงเป็นอักขระในสตริง หนึ่งในนั้นถูกดึง (นำเข้าโมดูลสุ่มสำหรับฟังก์ชัน random.choice () ซึ่งเลือกอักขระสุ่มในสตริง) สตริงใหม่, cardsLeft ถูกสร้างขึ้นเพื่อเก็บไพ่ที่เหลือที่กำหนดโดยฟังก์ชั่นสตริงแทนที่ () โดยที่พารามิเตอร์สุดท้ายบ่งชี้ว่าจะมีเพียง "ไพ่" หนึ่งอันที่จะถูกแทนที่ด้วยสตริงว่าง ...


6
def kill_char(string, n): # n = position of which character you want to remove
    begin = string[:n]    # from beginning to n (n not included)
    end = string[n+1:]    # n+1 through end of string
    return begin + end
print kill_char("EXAMPLE", 3)  # "M" removed

ผมเคยเห็นที่ไหนสักแห่งนี้ที่นี่


4

นี่คือสิ่งที่ฉันทำเพื่อตัด "M" ออก:

s = 'EXAMPLE'
s1 = s[:s.index('M')] + s[s.index('M')+1:]

2
นี่จะใช้งานได้กับสตริงที่ระบุนี้เท่านั้นและไม่ใช่โซลูชันทั่วไป
Andreas Bergström

3

หากคุณต้องการลบ / เพิกเฉยอักขระในสตริงและเช่นคุณมีสตริงนี้

"[11: L: 0]"

จากการตอบกลับเว็บ API หรืออะไรทำนองนั้นเช่นไฟล์ CSV สมมติว่าคุณกำลังใช้คำขอ

import requests
udid = 123456
url = 'http://webservices.yourserver.com/action/id-' + udid
s = requests.Session()
s.verify = False
resp = s.get(url, stream=True)
content = resp.content

วนซ้ำและกำจัดตัวอักษรที่ไม่ต้องการ:

for line in resp.iter_lines():
  line = line.replace("[", "")
  line = line.replace("]", "")
  line = line.replace('"', "")

ตัวเลือกแยกและคุณจะสามารถอ่านค่าแต่ละรายการ:

listofvalues = line.split(':')

การเข้าถึงแต่ละค่าทำได้ง่ายขึ้น:

print listofvalues[0]
print listofvalues[1]
print listofvalues[2]

สิ่งนี้จะพิมพ์

11

L

0


3

ในการลบ a charหรือsub-string ครั้งเดียว (เกิดขึ้นครั้งแรกเท่านั้น):

main_string = main_string.replace(sub_str, replace_with, 1)

หมายเหตุ: ที่นี่1สามารถถูกแทนที่ด้วยใด ๆintสำหรับจำนวนการเกิดขึ้นที่คุณต้องการแทนที่


3

คุณสามารถใช้ list comprehension

สมมติว่าคุณมีสตริง: และคุณต้องการที่จะลบตัวอักษรmy name is mใช้รหัสต่อไปนี้:

"".join([x for x in "my name is" if x is not 'm'])

0
from random import randint


def shuffle_word(word):
    newWord=""
    for i in range(0,len(word)):
        pos=randint(0,len(word)-1)
        newWord += word[pos]
        word = word[:pos]+word[pos+1:]
    return newWord

word = "Sarajevo"
print(shuffle_word(word))

2
ในขณะที่ข้อมูลโค้ดนี้อาจแก้ไขคำถามรวมถึงคำอธิบายช่วยปรับปรุงคุณภาพของโพสต์ของคุณ จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำรหัสของคุณ
Andreas

0

อีกวิธีคือฟังก์ชั่น

ด้านล่างเป็นวิธีการเอาเสียงสระทั้งหมดออกจากสตริงเพียงแค่เรียกใช้ฟังก์ชัน

def disemvowel(s):
    return s.translate(None, "aeiouAEIOU")

-7

สายอักขระไม่เปลี่ยนแปลงใน Python ดังนั้นตัวเลือกของคุณทั้งสองจึงมีความหมายเหมือนกันโดยทั่วไป

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