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

时间:2019-03-19 10:15:28

标签: python regex python-3.x

我有一个正则表达式:r'((\+91|0)?\s?\d{10})'

我正在尝试匹配+91 1234567890123456779001234567890之类的数字。

这些数字不应该匹配: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个字符。我也不想在第四个索引中输出,因为它的数量不完全匹配。因此,要么匹配完整的单词/字符串,要么无效。

还有其他可以使用的正则表达式吗?还是功能?我在这里做什么错了?

预期输出为:

[('+91 1234567890','1234567790', '01234567890']

请让我知道是否需要进一步澄清。

1 个答案:

答案 0 :(得分:2)

您可以使用

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

请参见regex demo

重点是将这些模式作为整个单词进行匹配,问题在于第一部分是可选的,而可选的替代单词中的一个以非单词char开头,因此单个\b单词边界不会在这里工作。

详细信息

  • (?<!\w)-当前位置的左侧不应紧跟单词char
  • (?:(?:\+91|0)\s?)?-的可选出现
    • (?:\+91|0)-+910
    • \s?-可选的空格
  • \d{10}\b-整个单词的十位数字匹配,两边都不允许有字符字符

Python demo

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']