我是正则表达式的新手,我想找到“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+ 空格和 \.?
关于Python RegEx - 负前瞻后不起作用?量词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53402567/