python - 多个否定先行断言

标签 python regex

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

相关文章:

python - 使用不同参数值多次运行 python 脚本的最佳方法

python - 多个调用级别的异常处理

php - 为什么它在下一行的开头添加文本,而不是在右一行的末尾添加文本?

python - 用于删除文本中除允许字符之外的所有字符的正则表达式

php - 将 PHP 的 preg_match_all 翻译成 Python

python - Scikit-learn 管道中的 Keras 模型与早期停止

python - 当我尝试对带有掩码的图像进行 bitwise_and 时,python 出现 OpenCV 错误

Python 大学名称和缩写以及网络链接

Javascript 将电话号码填充到 3 个输入文本框中,名称相同但没有 id

regex - sql 文件中的小写脚本