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

2024-09-26 22:07:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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。但它只匹配一次。在


Tags: andimportresearchuseithiam
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))

输出

^{pr2}$

如果需要实际匹配的对象而不是字符串,可以使用re.finditer

^{3}$

输出

<_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

因此,上述工作如预期:

>>> 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。但是如果你想让它匹配所有发生的事情,那么你可以通过这个实现它(+是贪婪的)

^{pr2}$

相关问题 更多 >

    热门问题