#python #regex #python-2.7 #python-3.x
#python #регулярное выражение #python-2.7 #python-3.x
Вопрос:
import re
x=""" hi i am laughing like hahahahahahaha. and i use it regularly"""
y=re.compile(r'(ha){1,5}')
z=y.search(x)
print z.group()
Здесь я хочу сопоставить ha
более одного раза. Но это сопоставление выполняется только один раз.
Комментарии:
1. Неясно, о чем вы спрашиваете — включите в вопрос формулировку проблемы
2.
>>> import re >>> x=""" hi i am laughing like hahahahahahaha. and i use it regularly""" >>> y=re.compile(r'(ha){1,5}') >>> z=y.search(x) >>> print z.group() hahahahaha
Это результат моего интерпретатора python.. ваш код правильный…3. В строке x я задал ha семь раз. приведенный мной код печатает только на ha. Но я хочу, чтобы это было напечатано 5 раз. моя цель напечатать хахахахаха из 7 ha. Код выдает только одно.
Ответ №1:
Итак, вышеописанное работает так, как ожидалось:
>>> x=""" hi i am laughing like hahahahahahaha. and i use it regularly"""
>>> import re
>>> y=re.compile(r'(ha){1,5}')
>>> z=y.search(x)
>>> z.group()
'hahahahaha'
Как вы упомянули в своем заявлении о поиске ha в диапазоне {1,5} и предоставлении вам жадного соответствия максимум до 5. Но если вы хотите, чтобы она соответствовала всем вхождениям, вы можете добиться этого следующим образом ( является жадным)
>>> y=re.compile(r'(ha) ')
>>> z=y.search(x)
>>> z.group()
'hahahahahahaha'
Ответ №2:
re.search
находит (не более) одно совпадение. Чтобы найти несколько совпадений, вы можете использовать re.findall
, который возвращает список совпадающих строк:
import re
x = """ hi i am laughing like hahahahahahaha. and i use it regularly"""
y = re.compile(r'(ha)')
print(y.findall(x))
вывод
['ha', 'ha', 'ha', 'ha', 'ha', 'ha', 'ha']
Если вам нужны реальные объекты соответствия, а не строки, вы можете использовать re.finditer
:
import re
x = """ hi i am laughing like hahahahahahaha. and i use it regularly"""
y = re.compile(r'(ha)')
for m in y.finditer(x):
print(m)
вывод
<_sre.SRE_Match object; span=(23, 25), match='ha'>
<_sre.SRE_Match object; span=(25, 27), match='ha'>
<_sre.SRE_Match object; span=(27, 29), match='ha'>
<_sre.SRE_Match object; span=(29, 31), match='ha'>
<_sre.SRE_Match object; span=(31, 33), match='ha'>
<_sre.SRE_Match object; span=(33, 35), match='ha'>
<_sre.SRE_Match object; span=(35, 37), match='ha'>
Если вы хотите найти все вхождения повторяющегося шаблона, вам нужна немного иная стратегия. Один из способов сделать это — использовать re.search
и обрезать целевую строку в точке совпадения и выполнять поиск снова, пока совпадений больше не будет найдено.
import re
x = """ hi i am laughing like hahahahahahaha. and i use it regularly"""
y = re.compile(r'(ha){1,5}')
patlen = 2
target = str(x)
while True:
m = y.search(target)
if not m:
break
target = target[patlen m.start(0):]
print(m.group(0))
вывод
hahahahaha
hahahahaha
hahahahaha
hahahaha
hahaha
haha
ha