Я пишу программу подсчета слов MapReduce на Python. Проблема в том, что в данных разбросано много не алфавитных символов, я нашел этот пост Удаление всего, кроме буквенно-цифровых символов из строки в Python, которая показывает хорошее решение с использованием регулярного выражения, но я не уверен, как его реализовать
def mapfn(k, v):
print v
import re, string
pattern = re.compile('[\W_]+')
v = pattern.match(v)
print v
for w in v.split():
yield w, 1
Боюсь, я не знаю, как использовать библиотеку re
или даже регулярное выражение в этом отношении. Я не уверен, как правильно применить шаблон регулярного выражения к входящей строке (строке книги), v
чтобы получить новую строку без каких-либо не буквенно-цифровых символов.
Предложения?
v
- это целая строка книги (в частности, moby dick), я перехожу слово в слово, а не символ за символом. Поэтому некоторые слова могут иметь в конце «унижение», поэтому «унижение» не сочетается с «унижением».Ответы:
Использовать
re.sub
import re regex = re.compile('[^a-zA-Z]') #First parameter is the replacement, second parameter is your input string regex.sub('', 'ab3d*E') #Out: 'abdE'
В качестве альтернативы, если вы хотите удалить только определенный набор символов (поскольку апостроф может быть в вашем вводе ...)
regex = re.compile('[,\.!?]') #etc.
источник
^a-zA-Z
вместо просто^a-zA-Z
a-zA-Z \n
. Я пытаюсь найти регулярное выражение, которое объединит оба в одно, но использует\w
или\W
не дает мне желаемого поведения. Возможно, вам просто нужно добавить,\n
если это так.Если вы предпочитаете не использовать регулярное выражение, вы можете попробовать
''.join([i for i in s if i.isalpha()])
источник
Вы можете использовать функцию re.sub () для удаления этих символов:
>>> import re >>> re.sub("[^a-zA-Z]+", "", "ABC12abc345def") 'ABCabcdef'
re.sub (СООТВЕТСТВИЕ ШАБЛОНУ, ЗАМЕНИТЬ СТРОКУ, СТРОКУ ДЛЯ ПОИСКА)
"[^a-zA-Z]+"
- ищите любую группу символов НЕ a-zA-z.""
- Замените совпадающие символы на ""источник
Пытаться:
s = ''.join(filter(str.isalnum, s))
Это возьмет все символы из строки, оставит только буквенно-цифровые и построит из них строку.
источник
Самый быстрый метод - регулярное выражение
#Try with regex first t0 = timeit.timeit(""" s = r2.sub('', st) """, setup = """ import re r2 = re.compile(r'[^a-zA-Z0-9]', re.MULTILINE) st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+' """, number = 1000000) print(t0) #Try with join method on filter t0 = timeit.timeit(""" s = ''.join(filter(str.isalnum, st)) """, setup = """ st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+' """, number = 1000000) print(t0) #Try with only join t0 = timeit.timeit(""" s = ''.join(c for c in st if c.isalnum()) """, setup = """ st = 'abcdefghijklmnopqrstuvwxyz123456789!@#$%^&*()-=_+' """, number = 1000000) print(t0) 2.6002226710006653 Method 1 Regex 5.739747313000407 Method 2 Filter + Join 6.540099570000166 Method 3 Join
источник
Рекомендуется использовать модуль PyPi,
regex
если вы планируете сопоставить определенные классы свойств Unicode. Эта библиотека также оказалась более стабильной, особенно при работе с большими текстами, и дает стабильные результаты для различных версий Python. Все, что вам нужно сделать, это поддерживать его в актуальном состоянии.Если вы установите его (используя
pip intall regex
илиpip3 install regex
), вы можете использоватьimport regex print ( regex.sub(r'\P{L}+', '', 'ABCŁąć1-2!Абв3§4“5def”') ) // => ABCŁąćАбвdef
, чтобы удалить все фрагменты из 1 или более символов, кроме букв Unicode
text
. См. Онлайн-демонстрацию Python . Вы также можете использовать"".join(regex.findall(r'\p{L}+', 'ABCŁąć1-2!Абв3§4“5def”'))
для получения того же результата.В Python
re
, чтобы соответствовать любой букве Unicode, можно использовать[^\W\d_]
конструкцию ( Match any unicode letter? ).Итак, чтобы удалить все небуквенные символы, вы можете сопоставить все буквы и объединить результаты:
result = "".join(re.findall(r'[^\W\d_]', text))
Или удалите все символы, кроме совпадающих с
[^\W\d_]
:result = re.sub(r'([^\W\d_])|.', r'\1', text, re.DOTALL)
См. Демонстрацию регулярных выражений в Интернете . Однако вы можете получить противоречивые результаты в разных версиях Python, потому что стандарт Unicode развивается, и набор совпадающих символов
\w
будет зависеть от версии Python.regex
Для получения стабильных результатов настоятельно рекомендуется использовать библиотеку PyPi .источник