Вопрос:
У меня есть пример строки: happy t00 go 129.129 и я хочу сохранить только пробелы и буквы. Все, что мне удалось довести до сих пор, это довольно эффективно:
print(re.sub(«d», «», ‘happy t00 go 129.129’.replace(‘.’, »)))
но это относится только к моей примерной строке. Как удалить все символы, кроме букв и пробелов?
Лучший ответ:whitelist = set(‘abcdefghijklmnopqrstuvwxy ABCDEFGHIJKLMNOPQRSTUVWXYZ’) myStr = «happy t00 go 129.129″ answer = ».join(filter(whitelist.__contains__, myStr))
Вывод:
>>> answer ‘happy t go ‘ Ответ №1
Используйте набор дополнений:
re.sub(r'[^a-zA-Z ]+’, », ‘happy t00 go 129.129’) Ответ №2
Небольшое изменение метода inspectorG4dget – импорт из понимания string и генератора:
from string import ascii_letters allowed = set(ascii_letters + ‘ ‘) myStr = ‘happy t00 go 129.129’ answer = ».join(l for l in myStr if l in allowed) answer # >>> ‘happy t go ‘
Сравнение производительности:
(Я сделал myStr немного дольше и предварительно скомпилировал регулярное выражение, чтобы сделать вещи немного интереснее)
import re from string import ascii_letters, digits myStr = ‘happy t00 go 129.129’*20 allowed = set(ascii_letters + ‘ ‘) # Generator %timeit answer = ».join(l for l in myStr if l in allowed) # filter/__contains__ %timeit answer = ».join(filter(allowed.__contains__, myStr)) # Regex pat = re.compile(r'[^a-zA-Z ]+’) %timeit answer = re.sub(pat, », myStr)
53 мкс ± 6,43 мкс на петлю (среднее ± стандартное отклонение 7 прогонов, 10000 циклов)
43,3 мкс ± 7,48 мкс на петлю (среднее ± стандартное отклонение 7 прогонов, 10000 циклов)
26 мкс ± 509 нс на петлю (среднее ± стандартное отклонение 7 прогонов, 10000 циклов)