我有一个字符串作为纯文本,并希望从中提取任何格式的电话号码。 这是我的正则表达式:
r = re.compile(r"(\d{3}[-\.\s]??\d{3}[-\.\s]??\d{4}|\(\d{3}\)[-\s*]\d{3}[-\.\s]??\d{4})")
它正确地提取以下匹配项:
617.933.6444
(880)-567-4565
(880) 567-4565
222-333-8888
555 666 4444
9999999999
但是,当我在文本中7986815059
时,如何避免获取798681505951
?
如何结束我的正则表达式? (它不应包含之前和之后的字母和数字,确切数字数必须为10)
!!!! 决定
如果有人需要在字符串中查找美国电话号码,请使用上一条WiktorStribiżew评论中的链接。
答案 0 :(得分:2)
您需要使用单词边界,但将它们放入您的模式中并不明显。这是因为第二种选择以非单词char \(
开头。因此,必须在第一个备选项的开头添加第一个\b
,并在模式的最后添加一个r'(\b\d{3}[-.\s]?\d{3}[-.\s]?\d{4}|\(\d{3}\)[-\s*]\d{3}[-.\s]?\d{4})\b'
^^ ^^
:
(
请参阅regex demo
您可能还需要\B
之前的非单词字符或字符串开头。然后在第二个替代开头添加r'(\b\d{3}[-.\s]?\d{3}[-.\s]?\d{4}|\B\(\d{3}\)[-\s*]\d{3}[-.\s]?\d{4})\b'
^^
:
.
请参阅another demo
另外,请注意,不需要在字符类中转义[.]
,它已被解析为??
中的文字点。并且不需要使用惰性?
量词,它在这里没有意义,贪婪的版本<div style="background-image:url(image.jpg)"></div>
将同样有效并且看起来更“干净”。