2010-11-05 39 views
17

Tôi muốn xóa tất cả các ký tự không phải chữ và số EXCEPT dấu gạch ngang từ một chuỗi (python). Làm cách nào để thay đổi cụm từ thông dụng này để khớp với bất kỳ ký tự không phải là chữ số và chữ số nào trừ dấu gạch nối?Làm cách nào để loại trừ một ký tự khỏi nhóm regex?

re.compile('[\W_]') 

Cảm ơn.

Trả lời

24

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.

+2

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

+0

số liệu định lượng sẽ làm cho việc này rẻ hơn. – SilentGhost

+0

Hoàn hảo. Cảm ơn! – ash

4

\w trận chữ cái và số, thêm vào các dấu nối, sau đó phủ nhận toàn bộ tập: r"[^\w-]"

+0

Tôi cho rằng dấu gạch dưới được coi là không có chữ và số;) – SilentGhost

+0

Điều này sẽ không khớp/thay thế ký tự gạch dưới, mà regex hiện tại của OP thực hiện. – eldarerathis

Các vấn đề liên quan