为了账号安全,请及时绑定邮箱和手机立即绑定

将正则表达式与整个字符串匹配,而不仅仅是字符串的一部分

将正则表达式与整个字符串匹配,而不仅仅是字符串的一部分

莫回无 2021-12-09 15:40:52
我有一个正则表达式: r'((\+91|0)?\s?\d{10})'我正在尝试匹配诸如+91 1234567890, 1234567790, 之类的数字01234567890。这些数字不应该匹配:1234568901112因为它不是以 +91 或 0 开头,或者不是只有 10 个数字:当我尝试使用re.findall():re.findall(r'((\+91|0)?\s?\d{10})', '+91 1234567890, 1234567790, 01234567890, 1234568901112')[('+91 1234567890', '+91'), (' 1234567790', ''), (' 0123456789', ''), (' 1234568901', '')]您可以注意到,在第三和第四个索引中,输出不是我想要的。我在第三个索引处的预期输出是 01234568890,因为它以 0 开头,后跟 10 个字符。但它只显示前 10 个字符。另外我不希望输出在第 4 个索引中,因为它的数字不完全匹配。所以要么它匹配完整的单词/字符串,否则它是无效的。我可以使用其他任何正则表达式吗?还是函数?我在这里做错了什么?预期的输出是:[('+91 1234567890','1234567790', '01234567890']如果需要更多说明,请告诉我。
查看完整描述

1 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

您可以使用

r'(?<!\w)(?:(?:\+91|0)\s?)?\d{10}\b'

请参阅正则表达式演示

关键是将这些模式作为整个单词进行匹配,问题是第一部分是可选的,其中一个可选的替代项以非单词字符开头,因此单个\b单词边界在这里不起作用。

细节

  • (?<!\w) - 在当前位置的左边不应该有字 char

  • (?:(?:\+91|0)\s?)? - 一个可选的出现

    • (?:\+91|0)+910

    • \s? - 一个可选的空格

  • \d{10}\b - 十位数字作为一个整体匹配,两边不允许有字符

import re

s = '+91 1234567890, 1234567790, 012345678900, 1234568901112, 01234567890'

print(re.findall(r'(?<!\w)(?:(?:\+91|0)\s?)?\d{10}\b', s))

# => ['+91 1234567890', '1234567790', '01234567890']


查看完整回答
反对 回复 2021-12-09
  • 1 回答
  • 0 关注
  • 265 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号