Заменить все не буквенно-цифровые символы в строке

100

У меня есть строка, в которой я хочу заменить любой символ, не являющийся стандартным символом или числом, например (az или 0-9), на звездочку. Например, «h ^ & ell`., | Ow] {+ orld» заменяется на «h * ell * o * w * orld». Обратите внимание, что несколько символов, таких как «^ &», заменяются одной звездочкой. Как бы я это сделал?

Чадвик
источник

Ответы:

184

Regex спешит на помощь!

import re

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

Пример:

>>> re.sub('[^0-9a-zA-Z]+', '*', 'h^&ell`.,|o w]{+orld')
'h*ell*o*w*orld'
nneonneo
источник
7
Если вы много работаете с Unicode, вам также может потребоваться сохранить все символы Unicode, отличные от ASCII:re.sub("[\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+", " ", ":%# unicode ΣΘΙП@./\n")
zhazha
Если вы хотите сохранить в строке пробелы, просто добавьте пробел в скобки: s = re.sub ('[^ 0-9a-zA-Z] +', '*', s)
stackPusher
2
Если выполнить более одной замены, это будет выполняться немного быстрее, если вы предварительно скомпилируете регулярное выражение, например,import re; regex = re.compile('[^0-9a-zA-Z]+'); regex.sub('*', 'h^&ell.,|o w]{+orld')
Крис
Также обратите внимание \Wна символы, не являющиеся словами, это почти то же самое, но допускает подчеркивание как символ слова (не знаю почему): docs.python.org/3.6/library/re.html#index-32
JHS
37

Питонический путь.

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

Однако это не касается группировки нескольких последовательных несовпадающих символов, т.е.

"h^&i => "h**iне "h*i"как в решениях с регулярными выражениями.

Baloan
источник
11

Пытаться:

s = filter(str.isalnum, s)

в Python3:

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

Изменить: понял, что OP хочет заменить не-символы на '*'. Мой ответ не подходит

Дон
источник
11

Использование, \Wэквивалентное [^a-zA-Z0-9_]. Проверьте документацию 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'

update: это решение также исключает подчеркивание. Если вы хотите исключить только буквы и цифры, то решение от nneonneo будет более подходящим.

псун
источник
1
Обратите внимание, что \Wэто эквивалентно[^a-zA-Z0-9_] только в Python 2.x. В Python 3.x \W+эквивалентно[^a-zA-Z0-9_] только при использовании re.ASCII/ re.Aflag.
Wiktor Stribiew 01