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

75

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

Ваш Ответ

4   ответа
10

использование\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('\W+', '*', s)
output: 'h*ell*o*w*orld'

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

Обратите внимание, что\W эквивалентно[^a-zA-Z0-9_] только в Python 2.x. В Python 3.x\W+ эквивалентно[^a-zA-Z0-9_] только если /re.ASCIIre.A флаг используется. Wiktor Stribiżew
8

Пытаться:

s = filter(str.isalnum, s)

Редактировать: понял, что ОП хочет заменить не символы с '*', Мой ответ не подходит

Безразлично»т работа в питоне 3 Alexey
134

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

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

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

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

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

Похожие вопросы