Skip to main content
 首页 » 编程设计

python之正则表达式无序重复匹配

2024年09月03日25mayingbao

我想表达的是:“这句话中有3个‘1’,1个‘2’。”

我希望所有这些情况都匹配:

a 1 b 1 c 1 d 2 
asdf 2 asdf 1 asdf 1 asdf 1 
a 1 b 1 c 2 1 
ab1c:1, cb2a:2, ca2c:1, 1 

(我不能使用 .count(),因为数字之间的字符可以是任何字符,包括数字。请参阅下面的进一步说明。)

可以这样表达:

for i in range(3): 
    # match separated '1' and eliminate the result in the target string 
    # if there's no match result, it doesn't match 
# match separated '2' 

,但我想在一个正则表达式中表达这一点。 我发现我可以使用 ^(?=.* (在这里输入字符) )(?=.* (等等) ).*$ 用于无序匹配。

但是使用 ^(?=.*1)(?=.*1)(?=.*1)(?=.*2).*$ 不会在这里工作,因为 ?= 不消耗字符。 不匹配失败:

ab 1 cd 1 ef 2 

进一步说明:

我真正想做的是 ^(?=.*[^\d-]1\b)(三次)(?= .*[^\d-]2\b).*$

请您参考如下方法:

使用不匹配数字的否定字符类将不起作用,例如第一个示例中数字 2 在数字 1 之后。

您可能匹配 1 的 3 次和 2 的 1 次,使用环视来确保左边和右边的不是数字:

^(?=(?:.*(?<!\d)1(?!\d)){3})(?=.*(?<!\d)2(?!\d)).+$ 

部分

  • ^字符串开始
  • (?=正面前瞻
    • (?:.*(?<!\d)1(?!\d)){3}重复 3 次匹配一个没有被数字包围的 1
  • )关闭前瞻
  • (?=正面前瞻
    • .*(?<!\d)2(?!\d)匹配一个没有被数字包围的 2
  • )关闭前瞻
  • .+匹配除换行符以外的任何字符 1+ 次
  • $字符串结束

Regex demo