我想多次匹配一个贪婪的字符串“ha”,但它只给出一个匹配。

时间:2016-10-24 07:14:51

标签: python regex 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。但它只匹配一次。

2 个答案:

答案 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