Замініть усі рядки, що не буквено-цифрові


99

У мене є рядок, за допомогою якого я хочу замінити будь-який символ, який не є стандартним символом або номером, таким як (az або 0-9), зірочкою. Наприклад, "h ^ & ell`., | Ow] {+ orld" замінено на "h * ell * o * w * orld". Зверніть увагу, що кілька символів, таких як "^ &", замінюються однією зірочкою. Як би я це зробив?


Відповіді:


182

Регекс на допомогу!

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'

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

36

Пітонічний спосіб.

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

Це не стосується групування кількох послідовних невідповідних символів, тобто

"h^&i => "h**iне так, "h*i"як у розчинах регулярних виразів.


11

Спробуйте:

s = filter(str.isalnum, s)

в Python3:

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

Редагувати: зрозумів, що ОП хоче замінити не символи на "*". Моя відповідь не підходить


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'

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


1
Зауважте, що \Wеквівалентно[^a-zA-Z0-9_] лише в Python 2.x. У Python 3.x \W+еквівалентно [^a-zA-Z0-9_]лише тому, що використовується re.ASCII/ re.Aпрапор.
Wiktor Stribiżew
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.