Python RegEx-负前瞻在工作后不起作用?量词

时间:2018-11-20 22:31:01

标签: python regex

我是regex的新手,我想查找“ po”的所有实例及其变体(即“ po | po | po”),ISN后面不跟“ box”,因为我很感兴趣在采购订单而不是邮政信箱中。下面的代码不起作用,即使与po匹配,即使后面跟有“ box”也是如此。有什么想法吗?

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

1 个答案:

答案 0 :(得分:3)

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

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

但是,由于Python re不支持它们,因此您需要将前瞻性移至o的必需部分之后,并将\.?添加到前瞻性中:

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

请参见regex demo。如果您打算将其作为一个整体匹配,请在\b之后添加box。与第一个p相同,您可能想在其前面添加一个\b,以将p作为一个整体匹配。

详细信息

  • p-一个p
  • \.?-可选(1或0)点
  • \s?-可选(1或0)空格
  • o-一个o
  • (?!\.?\s*box)-如果在当前位置的右边立即有一个可选的点,0 +空格和box
  • ,则负匹配将使匹配失败
  • \.?-可选(1或0)点