正则表达式结束

时间:2017-04-04 09:39:02

标签: python regex

我有一个字符串作为纯文本,并希望从中提取任何格式的电话号码。 这是我的正则表达式:

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评论中的链接。

1 个答案:

答案 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> 将同样有效并且看起来更“干净”。