我是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']
答案 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)点