3 回答

TA貢獻1898條經驗 獲得超8個贊
使用這種基于前瞻性的正則表達式,您可能無法完全按照所討論的那樣獲得,但會非常接近。
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
)
: 結束前瞻

TA貢獻1812條經驗 獲得超5個贊
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']
>>>
這將找到最長的匹配;如果您更改(.+)為,(.+?)您將在每個點獲得最短的匹配項。
>>> regex = r'(.+?)(?=\1{2})'
>>> re.findall(regex, 'aaabbbxxx_aaabbbxxx_aaabbbxxx_')
['a', 'b', 'x', 'a', 'b', 'x', 'a', 'b', 'x']

TA貢獻1828條經驗 獲得超3個贊
不先定義子模式是不可能的。
無論如何,如果子模式只是 <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_']
添加回答
舉報