Bạn chỉ có thể sử dụng một lớp nhân vật phủ nhận thay vì:
re.compile(r"[^a-zA-Z0-9-]")
này sẽ phù hợp bất cứ điều gì mà không có trong các dãy chữ và số hoặc gạch ngang. Nó cũng khớp với dấu gạch dưới, theo regex hiện tại của bạn.
>>> r = re.compile(r"[^a-zA-Z0-9-]")
>>> s = "some#%te_xt&with--##%--5 hy-phens *#"
>>> r.sub("",s)
'sometextwith----5hy-phens'
Lưu ý rằng điều này cũng thay thế khoảng trắng (có thể chắc chắn là những gì bạn muốn).
Edit: SilentGhost đã gợi ý nó có khả năng có thể rẻ hơn cho động cơ để xử lý với một lượng hóa, trong trường hợp này bạn chỉ có thể sử dụng:
re.compile(r"[^a-zA-Z0-9-]+")
Các +
sẽ chỉ đơn giản là gây ra bất kỳ chạy các ký tự liên tiếp khớp với tất cả các kết quả phù hợp (và được thay thế) cùng một lúc.
1 Bạn là đúng, loại bỏ câu trả lời của tôi là bạn bao gồm Tôi nghĩ rằng những gì ông muốn ... để phù hợp với bất kỳ ký tự không phải là số , thư, cũng không gạch nối. – birryree
số liệu định lượng sẽ làm cho việc này rẻ hơn. – SilentGhost
Hoàn hảo. Cảm ơn! – ash