Python удалить все, что не является буквой или цифрой - PullRequest
21 голосов
/ 12 июня 2011

У меня небольшие проблемы с регулярными выражениями Python.

Как можно удалить все символы в строке, которые не являются буквами или цифрами?

Спасибо!

Ответы [ 7 ]

26 голосов
/ 13 июня 2011

[\w] совпадений (буквенно-цифровой или подчеркивание).

[\W] соответствует (не (буквенно-цифровое или подчеркивание)), что эквивалентно (не буквенно-цифровое и не подчеркивание)

Вам нужно [\W_], чтобы удалить ВСЕ не алфавитно-цифровые символы.

При использовании re.sub () будет намного эффективнее, если вы сократите количество замен (дорого) путем сопоставления, используя [\W_]+ вместо того, чтобы делать это по одному.

Теперь все, что вам нужно, это определить буквенно-цифровые символы:

str объект, только ASCII A-Za-z0-9:

    re.sub(r'[\W_]+', '', s)

str объект, только буквенно-цифровые символы, определенные для локали:

    re.sub(r'[\W_]+', '', s, flags=re.LOCALE)

unicode объект, все буквы и цифры:

    re.sub(ur'[\W_]+', u'', s, flags=re.UNICODE)

Примеры для str объекта:

>>> import re, locale
>>> sall = ''.join(chr(i) for i in xrange(256))
>>> len(sall)
256
>>> re.sub('[\W_]+', '', sall)
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
>>> re.sub('[\W_]+', '', sall, flags=re.LOCALE)
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
>>> locale.setlocale(locale.LC_ALL, '')
'English_Australia.1252'
>>> re.sub('[\W_]+', '', sall, flags=re.LOCALE)
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\x83\x8a\x8c\x8e\
x9a\x9c\x9e\x9f\xaa\xb2\xb3\xb5\xb9\xba\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\
xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd8\xd9\xda\xdb\xdc\xdd\xde\
xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\
xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
# above output wrapped at column 80

Пример Unicode:

>>> re.sub(ur'[\W_]+', u'', u'a_b A_Z \x80\xFF \u0404', flags=re.UNICODE)
u'abAZ\xff\u0404'
7 голосов
/ 12 июня 2011

'\W' - это то же самое, что и [^A-Za-z0-9_] плюс акцентированные символы из вашей локали.

>>> re.sub('\W', '', 'text 1, 2, 3...')
'text123'

Возможно, вы хотите оставить пробелы или все слова (и цифры):

>>> re.findall('\w+', 'my. text, --without-- (punctuation) 123')
['my', 'text', 'without', 'punctuation', '123']
4 голосов
/ 12 июня 2011

В правиле соответствия набора символов [...] вы можете указать ^ в качестве первого символа, означающего "не в"

import re
re.sub("[^0-9a-zA-Z]",        # Anything except 0..9, a..z and A..Z
       "",                    # replaced with nothing
       "this is a test!!")    # in this string

--> 'thisisatest'
3 голосов
/ 12 июня 2011

Также вы можете попробовать использовать методы isalpha и isnumeric следующим образом:

text = 'base, sample test;'
getVals = lambda x: (c for c in text if c.isalpha() or c.isnumeric())
map(lambda word: ' '.join(getVals(word)): text.split(' '))
3 голосов
/ 12 июня 2011

Есть и другие способы, которые вы можете рассмотреть, например, просто переберите строку и пропустите ненужные символы, например при условии, что вы хотите удалить все символы ascii, которые не являются буквами или цифрами

>>> newstring = [c for c in "a!1#b$2c%3\t\nx" if c in string.letters + string.digits]
>>> "".join(newstring)
'a1b2c3x'

или используйте string.translate для сопоставления одного символа с другим или удаления некоторых символов, например

>>> todelete = [ chr(i) for i in range(256) if chr(i) not in string.letters + string.digits ]
>>> todelete = "".join(todelete)
>>> "a!1#b$2c%3\t\nx".translate(None, todelete)
'a1b2c3x'

таким образом вам нужно вычислить todelete список один раз или todelete один раз жестко закодировать и использовать его везде, где вам нужно преобразовать строку

1 голос
/ 12 июня 2011

Вам нужно быть более конкретным:

  1. А как насчет Unicode "буквы"? т. е. с диакритическими знаками.
  2. А как насчет пустого пространства? (Я полагаю, это то, что вы действительно хотите удалить вместе с пунктуацией)
  3. Когда вы говорите "буквы", вы имеете в виду A-Z и a-z только в ASCII?
  4. Когда вы говорите "цифры", вы имеете в виду только 0-9? А как насчет десятичных дробей, разделителей и показателей степени?

Это быстро становится сложным ...

Отличным местом для начала является интерактивный сайт регулярных выражений, например RegExr

Вы также можете получить специальный Python Python Regex Tool

1 голос
/ 12 июня 2011

вы можете использовать предопределенное регулярное выражение в python: \W соответствует набору [^a-zA-Z0-9_].Тогда

import re
s = 'Hello dutrow 123'
re.sub('\W', '', s)
--> 'Hellodutrow123'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...