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
也应该在那里