Đầu tiên, tôi muốn đồng ý với những người khác rằng các str.translate(...)
giải pháp regex hoặc dựa trên là hiệu quả nhất. Đối với trường hợp sử dụng của tôi, hiệu suất của chức năng này không đáng kể, vì vậy tôi muốn thêm ý tưởng mà tôi đã xem xét với tiêu chí đó.
Mục tiêu chính của tôi là khái quát hóa các ý tưởng từ một số câu trả lời khác thành một giải pháp có thể hoạt động cho các chuỗi chứa nhiều hơn chỉ các từ regex (nghĩa là liệt kê các tập hợp con rõ ràng của các ký tự dấu chấm câu so với các ký tự từ trong danh sách trắng).
Lưu ý rằng, trong bất kỳ cách tiếp cận nào, người ta cũng có thể xem xét sử dụng string.punctuation
thay cho danh sách được xác định thủ công.
Tùy chọn 1 - re.sub
Tôi đã rất ngạc nhiên khi thấy không có câu trả lời cho đến nay sử dụng re.sub (...) . Tôi thấy đó là một cách tiếp cận đơn giản và tự nhiên cho vấn đề này.
import re
my_str = "Hey, you - what are you doing here!?"
words = re.split(r'\s+', re.sub(r'[,\-!?]', ' ', my_str).strip())
Trong giải pháp này, tôi lồng cuộc gọi vào re.sub(...)
bên trong re.split(...)
- nhưng nếu hiệu suất là quan trọng, việc biên dịch regex bên ngoài có thể có lợi - đối với trường hợp sử dụng của tôi, sự khác biệt là đáng kể, vì vậy tôi thích sự đơn giản và dễ đọc hơn.
Tùy chọn 2 - str.replace
Đây là một vài dòng nữa, nhưng nó có lợi ích là có thể mở rộng mà không cần phải kiểm tra xem bạn có cần thoát khỏi một nhân vật nào đó trong regex hay không.
my_str = "Hey, you - what are you doing here!?"
replacements = (',', '-', '!', '?')
for r in replacements:
my_str = my_str.replace(r, ' ')
words = my_str.split()
Thay vào đó, thật tuyệt khi có thể ánh xạ str.replace vào chuỗi, nhưng tôi không nghĩ nó có thể được thực hiện bằng các chuỗi bất biến, và trong khi ánh xạ vào danh sách các ký tự sẽ hoạt động, chạy mọi thay thế đối với mọi ký tự Nghe có vẻ quá đáng. (Chỉnh sửa: Xem tùy chọn tiếp theo để biết ví dụ về chức năng.)
Tùy chọn 3 - funcools.reduce
(Trong Python 2, reduce
có sẵn trong không gian tên toàn cầu mà không cần nhập nó từ funcools.)
import functools
my_str = "Hey, you - what are you doing here!?"
replacements = (',', '-', '!', '?')
my_str = functools.reduce(lambda s, sep: s.replace(sep, ' '), replacements, my_str)
words = my_str.split()