猿问

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

我有一个正则表达式: 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']

如果需要更多说明,请告诉我。


莫回无
浏览 266回答 1
1回答

慕码人8056858

您可以使用r'(?<!\w)(?:(?:\+91|0)\s?)?\d{10}\b'请参阅正则表达式演示。关键是将这些模式作为整个单词进行匹配,问题是第一部分是可选的,其中一个可选的替代项以非单词字符开头,因此单个\b单词边界在这里不起作用。细节(?<!\w)&nbsp;- 在当前位置的左边不应该有字 char(?:(?:\+91|0)\s?)?&nbsp;- 一个可选的出现(?:\+91|0)-&nbsp;+91或0\s?&nbsp;- 一个可选的空格\d{10}\b&nbsp;- 十位数字作为一个整体匹配,两边不允许有字符import res = '+91 1234567890, 1234567790, 012345678900, 1234568901112, 01234567890'print(re.findall(r'(?<!\w)(?:(?:\+91|0)\s?)?\d{10}\b', s))# => ['+91 1234567890', '1234567790', '01234567890']
随时随地看视频慕课网APP

相关分类

Python
我要回答