亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

匹配所有重復字母數字子模式的正則表達式

匹配所有重復字母數字子模式的正則表達式

白豬掌柜的 2023-03-30 16:38:02
找了一段時間,只找到了如何匹配特定的子模式重復。有沒有辦法找到任何子模式的(3 次或更多次)重復?例如:re.findall(<the_regex>, 'aaabbbxxx_aaabbbxxx_aaabbbxxx_')→ ['a', 'b', 'x', 'aaabbbxxx_']re.findall(<the_regex>, 'lalala luuluuluul')→ ['la', 'luu', 'uul']如果這是重復的,我會提前道歉,如果能被重定向到原始問題,我將不勝感激。
查看完整描述

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

  • ): 結束前瞻


查看完整回答
反對 回復 2023-03-30
?
慕雪6442864

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


查看完整回答
反對 回復 2023-03-30
?
子衿沉夜

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_']


查看完整回答
反對 回復 2023-03-30
  • 3 回答
  • 0 關注
  • 186 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號