Chuỗi trong Python là bất biến (không thể thay đổi). Bởi vì điều này, hiệu quả của line.replace(...)
chỉ là tạo ra một chuỗi mới, thay vì thay đổi chuỗi cũ. Bạn cần rebind (gán) nó để line
biến đó lấy giá trị mới, với các ký tự đó bị xóa.
Ngoài ra, cách bạn đang làm nó sẽ là loại chậm, tương đối. Nó cũng có thể hơi khó hiểu với những con trăn có kinh nghiệm, những người sẽ nhìn thấy một cấu trúc gấp đôi và nghĩ trong giây lát rằng một cái gì đó phức tạp hơn đang diễn ra.
Bắt đầu trong Python 2.6 và các phiên bản Python 2.x mới hơn *, thay vào đó, bạn có thể sử dụng str.translate
(nhưng đọc về sự khác biệt của Python 3):
line = line.translate(None, '!@#$')
hoặc thay thế biểu thức chính quy bằng re.sub
import re
line = re.sub('[!@#$]', '', line)
Các ký tự được đặt trong ngoặc tạo thành một lớp ký tự . Bất kỳ ký tự line
nào trong lớp đó được thay thế bằng tham số thứ hai thành sub
: một chuỗi rỗng.
Trong Python 3, chuỗi là Unicode. Bạn sẽ phải dịch một chút khác nhau. kevpie đề cập đến điều này trong một bình luận về một trong những câu trả lời, và nó được ghi chú trong tài liệu chostr.translate
.
Khi gọi translate
phương thức của chuỗi Unicode, bạn không thể truyền tham số thứ hai mà chúng ta đã sử dụng ở trên. Bạn cũng không thể vượt qua None
như tham số đầu tiên, hoặc thậm chí là bảng dịch từ đó string.maketrans
. Thay vào đó, bạn vượt qua một từ điển như là tham số duy nhất. Từ điển này ánh xạ các giá trị thứ tự của các ký tự (nghĩa là kết quả của việc gọi ord
chúng) đến các giá trị thứ tự của các ký tự sẽ thay thế chúng, hoặc một cách hữu ích cho chúng tôi None
để xóa chúng.
Vì vậy, để thực hiện điệu nhảy trên với một chuỗi Unicode, bạn sẽ gọi một cái gì đó như
translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)
Ở đây dict.fromkeys
và map
được sử dụng để tạo ra một từ điển ngắn gọn chứa
{ord('!'): None, ord('@'): None, ...}
Thậm chí đơn giản hơn, như một câu trả lời khác đặt nó , tạo từ điển tại chỗ:
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})
* để tương thích với các Pythons trước đó, bạn có thể tạo bảng dịch "null" để thay thế None
:
import string
line = line.translate(string.maketrans('', ''), '!@#$')
Ở đây string.maketrans
được sử dụng để tạo bảng dịch , đây chỉ là một chuỗi chứa các ký tự có giá trị thứ tự từ 0 đến 255.
Đã hơn 5 năm, nhưng về cách sử dụng
– Trần Ái Như 10:35:35 06/02/2016filter
chức năng và Biểu thức Lambda :filter(lambda ch: ch not in " ?.!/;:", line)
. Khá ngắn gọn và hiệu quả quá, tôi nghĩ. Tất nhiên, nó trả về một chuỗi mới mà bạn sẽ phải gán tên cho.@JohnRed: Trên thực tế, nó trả về một trình vòng lặp trả về danh sách các ký tự nhưng nếu bạn đặt câu trả lời này, một vài người trong chúng ta sẽ vui lòng bỏ phiếu.
– Võ Ngọc Oanh 20:43:59 04/09/2017Dễ dàng với
– Dương Thanh Ngọc 21:25:09 25/09/2017re.sub
Python 3.5@BillBell: xem stackoverflow.com/a/46930314/1587329 và stackoverflow.com/a/41413861/1587329
– Vũ Thế Nhân 10:46:56 25/10/2017@BillBell: PS: đó là một trình vòng lặp trong Python3 và một chuỗi, bộ dữ liệu hoặc danh sách trong Python2
– Nguyễn Khắc Huy 10:55:12 25/10/2017