我在写一个正则表达式来匹配电话号码。我遇到的一个问题是有些邮政编码看起来像电话号码。例如,在巴西,邮政编码如下所示:
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前面的东西看起来像一个电话号码,那么它不是一个电话号码-它是一个邮政编码。我一直在尝试使用negative lookbehind编写正则表达式来捕获它,但它不起作用。它仍然匹配:
In [62]: re.search(r"(?<!CEP )(\d+\.\d+-\d+)", "CEP 30.160-0131")
Out[62]: <_sre.SRE_Match at 0x102150eb8>
为什么它仍然匹配,我怎么能得到负面的看后面失败的比赛?你知道吗
如果您允许匹配这些邮政编码,并且仍然只提取电话号码,则可以避免出现负面表情:
然后检查是否在
m.group(1)
中找到了电话号码。你知道吗带有
re.findall
的小演示:从那里,你可以过滤掉空字符串。你知道吗
表达式匹配,因为您没有执行任何操作来锚定数字。例如:
将匹配
1.213-132
,因为它不会紧跟在CEP
之后。但您可以强制空格或行锚的开头正好位于第一个数字之前:相关问题 更多 >
编程相关推荐