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
。但它只匹配一次。
答案 0 :(得分: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'
正如你在声明中提到的那样,在范围{1,5}中搜索ha并给你贪婪的匹配最大值为5.但是如果你想让它匹配所有出现,那么你就可以实现它(+是贪婪)
>>> y=re.compile(r'(ha)+')
>>> z=y.search(x)
>>> z.group()
'hahahahahahaha'
答案 1 :(得分:0)
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