匹配所有重复字母数字子模式的正则表达式

找了一段时间,只找到了如何匹配特定的子模式重复。有没有办法找到任何子模式的(3 次或更多次)重复?


例如:


re.findall(<the_regex>, 'aaabbbxxx_aaabbbxxx_aaabbbxxx_')

→ ['a', 'b', 'x', 'aaabbbxxx_']


re.findall(<the_regex>, 'lalala luuluuluul')

→ ['la', 'luu', 'uul']

如果这是重复的,我会提前道歉,如果能被重定向到原始问题,我将不胜感激。


白猪掌柜的
浏览 136回答 3
3回答

汪汪一只猫

使用这种基于前瞻性的正则表达式,您可能无法完全按照所讨论的那样获得,但会非常接近。r'(?=(.+)\1\1)'代码:>>> reg = re.compile(r'(?=(.+)\1\1)')>>> reg.findall('aaabbbxxx_aaabbbxxx_aaabbbxxx_')['aaabbbxxx_', 'b', 'x', 'a', 'b', 'x', 'a', 'b', 'x']>>> reg.findall('lalala luuluuluul')['la', 'luu', 'uul']正则表达式详细信息:由于我们将前瞻用作完整的正则表达式,因此我们并没有真正消耗字符,因为前瞻是零宽度匹配。这允许我们从输入中返回重叠的匹配项。使用findall我们只返回正则表达式中的捕获组。(?=: 开始前瞻(.+):匹配 1 个或多个任意字符(贪心)并在组 #1 中捕获\1\1: 使用反向引用匹配第 1 组的第 2 次出现\1\1): 结束前瞻

慕雪6442864

re.findall()不会找到重叠的匹配项。但是您可以使用捕获组找到非重叠匹配,然后使用与该组的反向引用相匹配的正前瞻。>>> import re>>> regex = r'(.+)(?=\1{2})'>>> re.findall(regex, 'aaabbbxxx_aaabbbxxx_aaabbbxxx_')['aaabbbxxx_', 'a', 'b', 'x', 'a', 'b', 'x']>>> re.findall(regex, 'lalala luuluuluul')['la', 'luu']>>>&nbsp;这将找到最长的匹配;如果您更改(.+)为,(.+?)您将在每个点获得最短的匹配项。>>> regex = r'(.+?)(?=\1{2})'>>> re.findall(regex, 'aaabbbxxx_aaabbbxxx_aaabbbxxx_')['a', 'b', 'x', 'a', 'b', 'x', 'a', 'b', 'x']

子衿沉夜

不先定义子模式是不可能的。无论如何,如果子模式只是 <any_alphanumeric>,那么re.findall(<the_regex>, 'aaabbbxxx_aaabbbxxx_aaabbbxxx_')会产生如下内容:['a', 'b', 'x', 'aa', 'ab', 'bb', 'bx', 'xx', 'x_', 'aaa', 'aaab', 'aaabb', ....]即,每个字母数字组合重复三次 - 所以有很多组合,而不仅仅是['a', 'b', 'x', 'aaabbbxxx_']
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python