Thay thế tất cả các ký tự không phải chữ và số trong một chuỗi


99

Tôi có một chuỗi mà tôi muốn thay thế bất kỳ ký tự nào không phải là ký tự hoặc số chuẩn, chẳng hạn như (az hoặc 0-9) bằng dấu hoa thị. Ví dụ: "h ^ & ell`., | Ow] {+ orld" được thay thế bằng "h * ell * o * w * orld". Lưu ý rằng nhiều ký tự như "^ &" được thay thế bằng một dấu hoa thị. Tôi sẽ đi đâu để tới đó?


Câu trả lời:


182

Regex đến giải cứu!

import re

s = re.sub('[^0-9a-zA-Z]+', '*', s)

Thí dụ:

>>> re.sub('[^0-9a-zA-Z]+', '*', 'h^&ell`.,|o w]{+orld')
'h*ell*o*w*orld'

7
Nếu bạn xử lý unicode rất nhiều, bạn cũng có thể cần phải giữ tất cả các ký tự phi ASCII unicode:re.sub("[\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+", " ", ":%# unicode ΣΘΙП@./\n")
zhazha

Nếu bạn muốn giữ lại khoảng trống trong chuỗi của bạn, chỉ cần thêm một không gian bên trong dấu ngoặc: s = re.sub ( '[^ 0-9a-zA-Z] +', '*', s)
stackPusher

2
Nếu thực hiện nhiều lần thay thế, điều này sẽ thực hiện nhanh hơn một chút nếu bạn biên dịch trước regex, ví dụ:import re; regex = re.compile('[^0-9a-zA-Z]+'); regex.sub('*', 'h^&ell.,|o w]{+orld')
Chris

Cũng lưu ý \Wlà đối với các ký tự không phải từ, nó gần như giống nhau nhưng cho phép gạch dưới như một ký tự từ (không biết tại sao): docs.python.org/3.6/library/re.html#index-32
JHS

36

Con đường trăn.

print "".join([ c if c.isalnum() else "*" for c in s ])

Tuy nhiên, điều này không giải quyết được việc nhóm nhiều ký tự không khớp liên tiếp, tức là

"h^&i => "h**ikhông "h*i"như trong các giải pháp regex.


11

Thử:

s = filter(str.isalnum, s)

trong Python3:

s = ''.join(filter(str.isalnum, s))

Chỉnh sửa: nhận ra rằng OP muốn thay thế các ký tự không phải ký tự bằng '*'. Câu trả lời của tôi không phù hợp


11

Sử dụng \Wtương đương với [^a-zA-Z0-9_]. Kiểm tra tài liệu, https://docs.python.org/2/library/re.html

Import re
s =  'h^&ell`.,|o w]{+orld'
replaced_string = re.sub(r'\W+', '*', s)
output: 'h*ell*o*w*orld'

cập nhật: Giải pháp này cũng sẽ loại trừ gạch dưới. Nếu bạn chỉ muốn loại trừ bảng chữ cái và số, thì giải pháp bằng nneonneo là thích hợp hơn.


1
Lưu ý rằng điều đó \Wchỉ tương đương với[^a-zA-Z0-9_] trong Python 2.x. Trong Python 3.x, \W+chỉ tương đương với [^a-zA-Z0-9_]nếu re.ASCII/ re.Acờ được sử dụng.
Wiktor Stribiżew
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.