[英]Match a regex to the whole string and not just a part of the string
我有一个正则表达式: 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个字符。 我也不想在第四个索引中输出,因为它的数量不完全匹配。 因此,要么匹配完整的单词/字符串,要么无效。
我还可以使用其他正则表达式吗? 还是功能? 我在这里做错了什么?
预期的输出是:
[('+91 1234567890','1234567790', '01234567890']
请让我知道是否需要更多说明。
您可以使用
r'(?<!\w)(?:(?:\+91|0)\s?)?\d{10}\b'
参见regex演示 。
关键是要将这些模式作为整个单词进行匹配,问题在于第一部分是可选的,而可选的替代单词中的一个以非单词char开头,因此单个\\b
单词边界在这里将不起作用。
细节
(?<!\\w)
-当前位置的左边不应有任何字符char (?:(?:\\+91|0)\\s?)?
-的可选事件
(?:\\+91|0)
- +91
或0
\\s?
-可选的空格 \\d{10}\\b
整个单词十位数匹配,两边都不允许有字符字符 Python演示 :
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']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.