我是正则表达式的新手,我想找到“po”的所有实例及其变体(即“po | po | po”),因为我对采购订单感兴趣,因此后面没有“box”而不是邮政信箱。下面的代码不起作用,即使后面跟着一个“框”,它也只是匹配 po。有任何想法吗?

string = " po  pobox  po box  po  box    p.o.  p.o.box  p.o. box  p.o.  box"

re.findall(r' p\.?\s?o\.?(?!\s*box)', string)

//expected output
[' po', ' p.o.']

//actual output
[' po', ' p.o.', ' p.o', ' p.o', ' p.o']

最佳答案

您将前瞻放在可选模式之后,回溯可以以另一种方式匹配字符串。

如果 Python 支持所有格量​​词,则可以通过在前瞻之前的 + 之后添加 \.? 来轻松解决: p\.?\s?o\.?+(?!\s*box) 。它会阻止引擎回溯到 \.? 模式。

但是,由于 Python re 不支持它们,您需要在 o ,必填部分之后立即移动前瞻,并将 \.? 添加到前瞻中:

r'p\.?\s?o(?!\.?\s*box)\.?'
          ^^^^^^^^^^^^^

请参阅 regex demo 。如果您打算将 \b 作为整个单词进行匹配,请在 box 之后添加 p。与第一个 \b 相同,您可能希望在它之前添加一个 p 以匹配 p 作为一个完整的单词。

详细信息
  • p - \.?
  • \s? - 一个可选的(1 或 0)点
  • o - 一个可选的(1 或 0)空格
  • o - (?!\.?\s*box)
  • box - 如果在当前位置的右侧有一个可选的点、0+ 空格和 \.?
  • 则匹配失败的负前瞻
  • ojit_code - 一个可选的(1 或 0)点
  • 关于Python RegEx - 负前瞻后不起作用?量词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53402567/

    10-11 16:20