Python 最多由2个(共3个)字符组成的子字符串

Python 最多由2个(共3个)字符组成的子字符串,python,regex,Python,Regex,我正在尝试编写一个正则表达式,它将匹配字符串中的所有子字符串,该字符串在['a','b','c'] 因此像abcccbaaa这样的字符串应该具有以下匹配项: ab bc bcc bccc cc ccc cccb ba baa baaa 到目前为止,我得到的是:a+a*| a+b*| a+c*| b+a*| b+b*| b+c*| c+a*| c+c* 但是这与像abab这样的字符串不匹配。我还尝试过这样包装每个单独的组合:(a+a*)+,但效果不太好。这在正则表达式中可能吗?您要寻找的表达式是

我正在尝试编写一个正则表达式,它将匹配字符串中的所有子字符串,该字符串在
['a','b','c']

因此像
abcccbaaa
这样的字符串应该具有以下匹配项:

ab
bc
bcc
bccc
cc
ccc
cccb
ba
baa
baaa
到目前为止,我得到的是:
a+a*| a+b*| a+c*| b+a*| b+b*| b+c*| c+a*| c+c*

但是这与像
abab
这样的字符串不匹配。我还尝试过这样包装每个单独的组合:
(a+a*)+
,但效果不太好。这在正则表达式中可能吗?

您要寻找的表达式是:(a+| b+|c+{2}

问题是re.findall()不会重叠匹配模式,因此:

re.findall("(a+|b+|c+){2}","abcccbaaa")
将仅查找连续(非重叠)匹配:“ab”、“cccb”和“aaa”。 (即,由于第一个“b”是“ab”匹配的一部分,因此不考虑将其作为“bc”匹配)

为了获得所有重叠模式,您必须在字符串上迭代执行re.match(),删除每个匹配的第一个字符,并在其余字符上执行re.match(),直到找不到更多匹配为止。您还需要在较大的匹配上递归应用搜索,因为它们也可能包含较小的匹配模式(例如,bccc包含bcc和bc)。最后,您可能希望从结果中消除重复项(例如,ccc实际上是两个重叠的cc模式)

我不认为您可以在单个正则表达式中执行此操作,但您可以在迭代函数中执行此操作:

import re

def multiMatch(pattern,string):
    result = []
    match  = re.match(pattern,string)
    while match:
        subString = string[match.start():match.end()]
        result.append(subString)
        result   += multiMatch(pattern,subString[:-1]) # see note below
        string    = string[match.start()+1:]
        match     = re.match(pattern,string)
    return list(set(result))

sorted(multiMatch("(a+|b+|c+){2}","abcccbaaa"))

>>> ['aa', 'aaa', 'ab', 'ba', 'baa', 'baaa', 'bc', 'bcc', 'bccc', 'cb', 'cc', 'ccb', 'ccc', 'cccb']

注意:在这一点上,您只需要从子字符串开始检查较小的模式。我很懒,只是递归地调用了函数,但这不是最优的,因为它会生成子匹配,然后被主循环捕获,然后被列表(set(result))消除。

您是否仅限于使用regex?@rukh ta是的,我正在尝试使用regex。我知道其他的解决方案,我只是想看看正则表达式是否也有可能。为什么不在结果中加入
cb
?jean francoisfabre是的,它应该在那里。如果
cc
ccc
在预期匹配中,那么
aa
aaa
也应该在那里