在进行正则表达式匹配时,有没有办法在出现次数中使用范围?

时间:2018-02-07 06:43:14

标签: python regex

给定一个字符串aaabbb有一种方法可以编写正则表达式来查找ab,aabb,aaabbb等子串的数量。

我是通过构建一个正则表达式[a]{m}[b]{m}并迭代一系列值来实现的。但我想知道是否有办法一次性完成。

2 个答案:

答案 0 :(得分:1)

如评论中所述,^(?:a(?=a*(\1?+b)))+\1$允许使用广泛的正则表达式功能来匹配这种平衡的构造。

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

答案 1 :(得分:0)

这不是一个确切的解决方案,只是一个帮助你的提示。如果有用,您可以从此代码中获取帮助。

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'>
....