Подтвердить что ты не робот

Python, удалите все символы из алфавита из строки

Я пишу программу подсчета слов Python MapReduce. Проблема в том, что в данных много символов алфавита, я нашел это сообщение Удаление всего, кроме буквенно-цифровых символов из строки в Python, которая показывает хорошее решение используя regex, но я не уверен, как его реализовать

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, чтобы получить новую строку без каких-либо букв без буквенно-цифровых символов.

Предложения?

4b9b3361

Ответ 1

Использовать 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.

Ответ 2

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

''.join([i for i in s if i.isalpha()])

Ответ 3

Вы можете использовать функцию re.sub() для удаления этих символов:

>>> import re
>>> re.sub("[^a-zA-Z]+", "", "ABC12abc345def")
'ABCabcdef'

re.sub(MATCH PATTERN, REPLACE STRING, STRING TO SEARCH)

  • "[^a-zA-Z]+" - найдите любую группу символов, которые НЕ A-Za-г.
  • "" - Замените совпадающие символы на ""

Ответ 4

Try:

s = filter(str.isalnum, s)

Ответ 5

Самый быстрый метод - регулярное выражение

#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 = '[email protected]#$%^&*()-=_+'
""", number = 1000000)
print(t0)

#Try with join method on filter
t0 = timeit.timeit("""
s = ''.join(filter(str.isalnum, st))

""", setup = """
st = '[email protected]#$%^&*()-=_+'
""",
number = 1000000)
print(t0)

#Try with only join
t0 = timeit.timeit("""
s = ''.join(c for c in st if c.isalnum())

""", setup = """
st = '[email protected]#$%^&*()-=_+'
""", number = 1000000)
print(t0)


2.6002226710006653 Method 1 Regex
5.739747313000407 Method 2 Filter + Join
6.540099570000166 Method 3 Join