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ư là tham số đầu tiên. Thay vào đó, bạn chuyển một bảng dịch (thường là từ điển) làm tham số duy nhất. Bảng 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 hữu ích cho chúng taNone
để chỉ ra rằng chúng nên bị xóa.
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 bảng dịch tại chỗ:
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})
Hoặc tạo cùng một bảng dịch với str.maketrans
:
unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))
* để 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.
filter
chức năng và Biểu thức Lambda :filter(lambda ch: ch not in " ?.!/;:", line)
. Khá súc tích 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.