在进行正则表达式匹配时,是否有方法使用出现次数的范围?

2024-10-03 06:26:12 发布

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

给定一个字符串aaabbb,有没有一种方法可以编写regex来查找像ab、aabb、aaabbb这样的子字符串的数量。你知道吗

我是通过构造regex [a]{m}[b]{m}并迭代一系列值来实现的。但我想知道是否有一种方法可以一次性完成。你知道吗


Tags: 方法字符串数量abregexaabbaaabbb
2条回答

正如在评论中所说,^(?:a(?=a*(\1?+b)))+\1$允许使用广泛的regex功能匹配这种平衡的结构。你知道吗

Demo

完整解释here。你知道吗

也就是说,如果要列出与平衡结构匹配的所有重叠子字符串,可以使用(?=((?:a(?=a*(\2?+b)))+\2))

(?=                         # Using a lookahead allows to restart matching even if a match has already been found, as a lookaround doesn't "consume" its content.
  (                         # Using a capturing group allows to retrieve the match.
    (?:a(?=a*(\2?+b)))+\2)  # As an outer capturing group has been defined, thus numbered 1, we rewrite the inner part using the proper group 2.
  )
)

Demo

这不是一个精确的解决方案,只是一个帮助你的提示。如果这段代码有用,您可以从中获得帮助。你知道吗

import re
s='aaabbb'
def _all_sub(_s,_ss):
    if not _ss:
        return 0
    else:
        for i in range(0,len(_s),1):
            pattern=r'{}'.format(_s[i:i+_ss[0]])
            print(re.search(pattern,s))
        return _all_sub(_s,_ss[1:])
print(_all_sub(s,list(range(len(s)))))

样本输出:

....
    <_sre.SRE_Match object; span=(3, 6), match='bbb'>
    <_sre.SRE_Match object; span=(3, 5), match='bb'>
    <_sre.SRE_Match object; span=(3, 4), match='b'>
    <_sre.SRE_Match object; span=(0, 4), match='aaab'>
    <_sre.SRE_Match object; span=(1, 5), match='aabb'>
    <_sre.SRE_Match object; span=(2, 6), match='abbb'>
    <_sre.SRE_Match object; span=(3, 6), match='bbb'>
    <_sre.SRE_Match object; span=(3, 5), match='bb'>
    <_sre.SRE_Match object; span=(3, 4), match='b'>
    <_sre.SRE_Match object; span=(0, 5), match='aaabb'>
    <_sre.SRE_Match object; span=(1, 6), match='aabbb'>
    <_sre.SRE_Match object; span=(2, 6), match='abbb'>
    <_sre.SRE_Match object; span=(3, 6), match='bbb'>
    <_sre.SRE_Match object; span=(3, 5), match='bb'>
    <_sre.SRE_Match object; span=(3, 4), match='b'>
....

相关问题 更多 >