Python 多个否定的前瞻断言

Python 多个否定的前瞻断言,python,regex,Python,Regex,我不知道如何在我的一生中做多次环顾。假设我想在散列之后匹配一个可变数量的数字,但如果前面有某个东西或后面有其他东西,则不匹配。例如,我想在下面匹配#123或#12345。长相落后的人似乎很好,但长相落后的人却不行。我没有主意了 matches = ["#123", "This is #12345", # But not "bad #123", "No match #12345", "This is #123-ubuntu", "

我不知道如何在我的一生中做多次环顾。假设我想在散列之后匹配一个可变数量的数字,但如果前面有某个东西或后面有其他东西,则不匹配。例如,我想在下面匹配#123或#12345。长相落后的人似乎很好,但长相落后的人却不行。我没有主意了

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