首页 / 正则 / Python正则表达式否定后向匹配失败
Python正则表达式否定后向匹配失败
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python正则表达式否定后向匹配失败,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1185字,纯文字阅读大概需要2分钟。
内容图文
![Python正则表达式否定后向匹配失败](/upload/InfoBanner/zyjiaocheng/661/233d8c7c35bb4eacbe58cfb5e22cbf94.jpg)
我正在写一个正则表达式来匹配电话号码.我遇到的问题之一是某些邮政编码看起来像电话号码.例如,在巴西,邮政编码看起来像这样:
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 = 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']
从那里,您可以过滤出空字符串.
内容总结
以上是互联网集市为您收集整理的Python正则表达式否定后向匹配失败全部内容,希望文章能够帮你解决Python正则表达式否定后向匹配失败所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。