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