Я хочу сопоставить жадную строку «ha» более одного раза, но это дает только одно совпадение.

#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