Cách xóa ký tự khỏi chuỗi bằng Python


457

Có một chuỗi, ví dụ. EXAMPLE.

Làm thế nào tôi có thể loại bỏ ký tự giữa, tức là, Mtừ nó? Tôi không cần mã. Tôi muốn biết:

  • Các chuỗi trong Python kết thúc bằng ký tự đặc biệt nào?
  • Đó là cách tốt hơn - chuyển mọi thứ từ phải sang trái bắt đầu từ ký tự giữa HOẶC tạo một chuỗi mới và không sao chép ký tự giữa?

Câu trả lời:


639

Trong Python, các chuỗi là bất biến, vì vậy bạn phải tạo một chuỗi mới. Bạn có một vài tùy chọn về cách tạo chuỗi mới. Nếu bạn muốn xóa 'M' bất cứ nơi nào nó xuất hiện:

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

Nếu bạn muốn loại bỏ nhân vật trung tâm:

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

Bạn hỏi nếu chuỗi kết thúc với một ký tự đặc biệt. Không, bạn đang suy nghĩ như một lập trình viên C. Trong Python, các chuỗi được lưu trữ với độ dài của chúng, vì vậy mọi giá trị byte, bao gồm \0, có thể xuất hiện trong một chuỗi.


16
Cho rằng người hỏi là hoàn toàn mới đối với python, có thể đáng chú ý rằng trong khi ở phiên bản 2.X python, toán tử "/" trả về một số nguyên (bị cắt về 0), trong phiên bản 3.X python bạn nên sử dụng "//" thay thế. Ngoài ra, dòng from __future__ import divisionở đầu tập lệnh của bạn sẽ khiến phiên bản 2.X python hoạt động giống như phiên bản 3.X
Michael Dunn

1
Lưu ý rằng nếu "M" là nội dung duy nhất của dòng, "" để lại một dòng trống ở vị trí của nó.
8bitjunkie

1
@ 7 Đặc biệt, nó phụ thuộc hoàn toàn vào những gì bạn làm với chuỗi này. Một chuỗi rỗng như ""không ngụ ý một dòng trống. Nếu bạn đưa nó vào một danh sách và tham gia nó với các dòng mới, thì nó sẽ tạo một dòng trống, nhưng có rất nhiều nơi khác bạn có thể sử dụng một chuỗi trống sẽ không làm điều đó.
Ned Batchelder

68

Đây có lẽ là cách tốt nhất:

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

Đừng lo lắng về việc thay đổi nhân vật và như vậy. Hầu hết mã Python diễn ra ở mức độ trừu tượng cao hơn nhiều.


6
Mcó thể không phải là duy nhất. Trong trường hợp đó, điều này sẽ thay thế tất cả các Ms, phải không?
Lazer

14
Vâng đúng rồi. Nếu bạn chỉ muốn thay thế nlần xuất hiện, sử dụng original.replace("M", "", n).
đệ quy

1
@ S.Lott Tôi lấy đó là lời hùng biện, để đề nghị cung cấp giải pháp chỉ thay thế một trường hợp
Dodgie

63

Để thay thế một vị trí cụ thể:

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

Để thay thế một ký tự cụ thể:

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

18
Mặc dù điều này có thể hoạt động, tôi nghĩ rằng câu trả lời của bạn có thể được cải thiện bằng cách giải thích những gì đang diễn ra trong phần đầu tiên, vì các thao tác chuỗi con không nhất thiết phải dễ hiểu đối với người mới sử dụng Python mà không có bất kỳ lời giải thích nào.
jloubert

Vậy nếu độ dài của s là l. Sau đó, đối với phần đầu tiên, các ràng buộc cho pos nên được l-1 > pos >= 0.
Haoyu Chen

s [: pos] nhận chuỗi con từ 0 đến pos-1 và s [(pos + 1):] nhận chuỗi con từ pos + 1 đến hết. Do đó, nó loại bỏ s [pos] khỏi s.
s.singh

Nó không thay thế, nó rơi. thật tốt để phân biệt hoạt động bằng cách cung cấp các ví dụ cho cả hai trường hợp sử dụng chính, được phân tách bằng phương pháp chọn vị trí của chúng.
Alexander Stohr

28

Dây là bất biến. Nhưng bạn có thể chuyển đổi chúng thành một danh sách, có thể thay đổi và sau đó chuyển đổi danh sách thành chuỗi sau khi bạn thay đổi nó.

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

Bạn cũng có thể tạo một chuỗi mới, như những người khác đã thể hiện, bằng cách lấy mọi thứ trừ ký tự bạn muốn từ chuỗi hiện có.


4
Tại sao bạn không sử dụng str.replacephương pháp này?
alichaudry

12

Làm thế nào tôi có thể loại bỏ ký tự giữa, tức là M khỏi nó?

Bạn không thể, bởi vì các chuỗi trong Python là bất biến .

Các chuỗi trong Python kết thúc bằng ký tự đặc biệt nào?

Không. Chúng tương tự như danh sách các ký tự; độ dài của danh sách xác định độ dài của chuỗi và không có ký tự nào đóng vai trò là dấu kết thúc.

Đó là cách tốt hơn - chuyển mọi thứ từ phải sang trái bắt đầu từ ký tự giữa HOẶC tạo một chuỗi mới và không sao chép ký tự giữa?

Bạn không thể sửa đổi chuỗi hiện có, vì vậy bạn phải tạo một chuỗi mới chứa mọi thứ trừ ký tự giữa.


11

Sử dụng translate()phương pháp:

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

3
Phương pháp đã thay đổi. Xem tài liệu cho Python 3: translate () Điều này thay thế các ký tự khác nhau bằng khoảng trắng ( Noneđể loại bỏ dường như không hoạt động):translate( str.maketrans("<>", " ") )
xử lý

1
Trên thực tế, các tài liệu chỉ định hai cách để loại bỏ các ký tự khác nhau bằng dịch () trong Python 3 ,: str.maketrans( "", "", "<>")str.maketrans( {"<":None,">":None })
xử lý

3
Mã tương đương trong câu trả lời đã trở thành mã này trong python3:'EXAMPLE'.translate({ord("M"): None})
yoniLavi


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

Cách xóa một ký tự khỏi chuỗi: Dưới đây là một ví dụ trong đó có một chồng thẻ được biểu thị dưới dạng các ký tự trong chuỗi. Một trong số chúng được vẽ (nhập mô-đun ngẫu nhiên cho hàm Random.choice (), chọn một ký tự ngẫu nhiên trong chuỗi). Một chuỗi mới, cardLeft, được tạo để giữ các thẻ còn lại được cung cấp bởi hàm chuỗi thay thế () trong đó tham số cuối cùng chỉ ra rằng chỉ có một "thẻ" được thay thế bằng chuỗi trống ...


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

Tôi đã thấy điều này ở đâu đó ở đây .


4

Đây là những gì tôi đã làm để cắt ra chữ "M":

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

2
Điều này sẽ chỉ làm việc chuỗi cụ thể này và không phải là một giải pháp chung.
Andreas Bergström

3

Nếu bạn muốn xóa / bỏ qua các ký tự trong một chuỗi và, ví dụ, bạn có chuỗi này,

"[11: L: 0]"

từ phản hồi API web hoặc một cái gì đó tương tự, như tệp CSV, giả sử bạn đang sử dụng các yêu cầu

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

lặp và loại bỏ các ký tự không mong muốn:

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

Phân chia tùy chọn và bạn sẽ có thể đọc các giá trị riêng lẻ:

listofvalues = line.split(':')

Bây giờ truy cập từng giá trị dễ dàng hơn:

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

Cái này sẽ in

11

L

0


3

Để xóa một charhoặc một sub-string lần (chỉ lần xuất hiện đầu tiên):

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

LƯU Ý: Ở đây 1có thể được thay thế bằng bất kỳ intsố lần xuất hiện bạn muốn thay thế.


3

Bạn chỉ có thể sử dụng hiểu danh sách.

Giả sử rằng bạn có chuỗi: my name isvà bạn muốn xóa ký tự m. sử dụng mã sau đây:

"".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
Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
andreas

0

Một cách khác là với một chức năng,

Dưới đây là một cách để loại bỏ tất cả các nguyên âm khỏi chuỗi, chỉ bằng cách gọi hàm

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

-7

Các chuỗi là bất biến trong Python vì vậy cả hai tùy chọn của bạn đều có nghĩa giống nhau về cơ bản.

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.