繁体   English   中英

Python正则表达式负面看后面没有失败的匹配

[英]Python regex negative lookbehind not failing match

我正在写一个正则表达式来匹配电话号码。 我遇到的一个问题是一些邮政编码看起来像电话号码。 例如,在巴西,邮政编码如下所示:

30.160-0131

所以一个简单的正则表达式会将它们捕获为误报:

In [63]: re.search(r"(?P<phone>\d+\.\d+-\d+)", "30.160-0131")
Out[63]: <_sre.SRE_Match at 0x102150990>

幸运的是,这样的邮政编码通常带有一个前缀,通常意味着“邮政编码”,如下所示:

CEP 30.160-0131

所以,如果你看到CEP看起来像一个电话号码,那么它不是一个电话号码 - 它是一个邮政编码。 我一直试图写一个正则表达式来捕捉使用负面的后观 ,但它不起作用。 它仍然匹配:

In [62]: re.search(r"(?<!CEP )(\d+\.\d+-\d+)", "CEP 30.160-0131")
Out[62]: <_sre.SRE_Match at 0x102150eb8>

为什么它仍然匹配,如何让负面的后卫失败?

表达式匹配,因为您没有执行任何操作来锚定数字。 例如:

"CEP 11.213-132"

将匹配1.213-132因为它不会立即跟随CEP 但是你可以强制在第一个数字之前的空格或行锚的开头:

re.search(r"(?<!CEP)(?:\s+|^)(\d+\.\d+-\d+)", s)

如果您允许匹配这些邮政编码,并且仍然只提取电话号码,则可以避免否定前瞻:

m = re.search(r"CEP \d+\.\d+-\d+|(\d+\.\d+-\d+)", s)

然后检查m.group(1)是否有电话号码。


re.findall小演示:

>>> import re
>>> s = "There is a CEP 30.160-0131 and a  30.160-0132 in that sentence, which repeats itself like there is a CEP 30.160-0131 and a  30.160-0132 in that sentence."
>>> m = re.findall(r"CEP \d+\.\d+-\d+|(\d+\.\d+-\d+)", s)
>>> print(m)
['', '30.160-0132', '', '30.160-0132']

从那里,你可以过滤掉空字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM