我有一个正则表达式: 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)
-+91
或0
\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']
添加回答
举报
0/150
提交
取消