我想表达的是:“这句话中有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+ 次 -
$字符串结束
