kosyachniy
@kosyachniy
Python BackEnd, Web FullStack

Python Регулярные выражения Как оставить в строке только буквы a-z?

Нужен самый оптимальный способ оставить в строке только латинские маленькие буквы

Я сделал это так:
''.join(re.findall('[a-z]', 'bla123bla'))
Но кажется, можно сделать и проще, может даже без регулярок
На входе будут громадные значения, поэтому необходимо оптимизировать по максимуму

Спасибо)
  • Вопрос задан
  • 13422 просмотра
Решения вопроса 1
longclaps
@longclaps
re.sub('[^a-z]', '', s)
Если многократная замена - регекс лучше скомпилировать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Cenzor
pattern = re.compile('^[a-z]*')
result = pattern.findall('ghvf567gfrtyFgHth76G')
print(result)
['ghvf', 'gfrty', 'g', 'th']
Ответ написан
Комментировать
planc
@planc
"не оптимизируй раньше времени" (c) все

import re

s = "Ahjrh3892h89*@(!894y19hKJAHjjfnakjznUIZHiuhrweui"


def withsub(st):
    new_s = re.sub(r'[^a-z]', '', st)
    return new_s


def withfindall(st):
    new_s = ''.join(re.findall('[a-z]', st))
    return new_s


def withoutregex(st):
    new_s = ''.join([a for a in st if a.isalpha() and a.islower()])
    return new_s


ipython
In [1]: from tes import s, withsub, withfindall, withoutregex

In [2]: s
Out[2]: 'Ahjrh3892h89*@(!894y19hKJAHjjfnakjznUIZHiuhrweui'

In [3]: %timeit withsub(s)
The slowest run took 33.17 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 5.08 µs per loop

In [4]: %timeit withfindall(s)
The slowest run took 35.48 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 4.64 µs per loop

In [5]: %timeit withoutregex(s)
100000 loops, best of 3: 7.06 µs per loop
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы