Python 多个否定的前瞻断言
我不知道如何在我的一生中做多次环顾。假设我想在散列之后匹配一个可变数量的数字,但如果前面有某个东西或后面有其他东西,则不匹配。例如,我想在下面匹配#123或#12345。长相落后的人似乎很好,但长相落后的人却不行。我没有主意了Python 多个否定的前瞻断言,python,regex,Python,Regex,我不知道如何在我的一生中做多次环顾。假设我想在散列之后匹配一个可变数量的数字,但如果前面有某个东西或后面有其他东西,则不匹配。例如,我想在下面匹配#123或#12345。长相落后的人似乎很好,但长相落后的人却不行。我没有主意了 matches = ["#123", "This is #12345", # But not "bad #123", "No match #12345", "This is #123-ubuntu", "
matches = ["#123", "This is #12345",
# But not
"bad #123", "No match #12345", "This is #123-ubuntu",
"This is #123 0x08"]
pat = '(?<!bad )(?<!No match )(#[0-9]+)(?! 0x0)(?!-ubuntu)'
for i in matches:
print i, re.search(pat, i)
matches=[“#123”,“这是#12345”,
#但不是
“坏123”,“不匹配12345”,“这是123 ubuntu”,
“这是#123 0x08”]
pat='(?您也应该看看捕获的内容。我打赌最后两个字符串您将得到:
#12
情况就是这样:
引擎检查两个LookBehind-它们不匹配,因此继续捕获组#[0-9]+
和匹配的#123
。现在它检查lookaheads。它们会根据需要失败。但是现在有回溯!模式中有一个变量,即+
。因此引擎会丢弃最后匹配的字符(3
)然后再试一次。现在lookaheads不再是问题了,您将获得一个匹配项。解决此问题的最简单方法是添加另一个lookahead,确保您转到最后一位:
pat = r'(?<!bad )(?<!No match )(#[0-9]+)(?![0-9])(?! 0x0)(?!-ubuntu)'
这取决于你觉得哪个更可读或更易于维护。尽管后者会稍微更有效。(感谢NHAHDH为我指出了regex
包。)Python中没有所有格量词re
@nhahDH只是在谷歌上搜索、意识到并编辑了它。无论如何,谢谢!)不过,我相信regex
包确实有这样的功能(它支持比所有格量词更奇特的东西)。
pat = r'(?<!bad )(?<!No match )(#[0-9]++)(?! 0x0)(?!-ubuntu)'