gpt4 book ai didi

python - 多个否定先行断言

转载 作者:行者123 更新时间:2023-11-28 16:43:36 24 4
gpt4 key购买 nike

我想不出如何在我的生活中进行多次环视。假设我想匹配散列后面的可变数量的数字,但如果前面有或后面有其他内容则不匹配。例如,我想在下面匹配#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)

最佳答案

您也应该看看捕获的内容。我打赌你会得到最后两个字符串:

#12

是这样的:

引擎会检查这两个 lookbehind - 它们不匹配,因此它继续捕获组 #[0-9]+ 并匹配 #123。现在它检查前瞻。他们如愿以偿地失败了。但是现在有回溯!模式中有一个变量,即+。因此引擎会丢弃最后一个匹配的字符 (3) 并重试。现在前瞻不再是问题,你得到了匹配。解决此问题的最简单方法是添加另一个前瞻性以确保您转到最后一位数字:

pat = r'(?<!bad )(?<!No match )(#[0-9]+)(?![0-9])(?! 0x0)(?!-ubuntu)'

请注意原始字符串的使用(前导 r)- 在这种模式中这无关紧要,但这通常是一种很好的做法,因为一旦开始转义字符,事情就会变得很难看。

编辑:如果您正在使用或愿意使用 regex package 而不是 re,你会得到抑制回溯的所有格量词:

pat = r'(?<!bad )(?<!No match )(#[0-9]++)(?! 0x0)(?!-ubuntu)'

这取决于您发现哪个更具可读性或可维护性。不过,后者的效率会稍微高一些。 (感谢 nhahtdh 为我指明了 regex 包。)

关于python - 多个否定先行断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16204675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com