【问题标题】:regular expression ending正则表达式结尾
【发布时间】:2017-04-04 18:09:40
【问题描述】:

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

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

但是当我在文本中有798681505951 时,如何避免得到7986815059

如何为我的正则表达式添加结尾? (前后不能包含字母和数字,准确的数必须是10)

!!!! 决定

如果有人需要在字符串中查找美国电话号码,请使用最后一条 Wiktor Stribiżew 评论中的链接。

【问题讨论】:

  • 在开头添加^,在末尾添加$
  • 我有一个孔字符串作为纯文本。在开头添加 ^ 并在末尾添加 $ 无济于事
  • 我真的不明白你是怎么输入的。 regex101.com/r/QzRJIK/3
  • 嗯,你的意思是你有像here这样的输入吗?你想提取那些子字符串吗?
  • 现在看来是正确的。我的错,我没有想到我可以将第一个 \b 放在范围内。谢谢

标签: python regex


【解决方案1】:

您需要使用单词边界,但将它们放入您的模式中并不明显。这是因为第二种选择以非单词字符\( 开头。因此,第一个 \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

另外,请注意,没有必要在字符类中转义 .,它已经在 [.] 中被解析为文字点。并且不需要使用懒惰的?? 量词,它在这里没有意义,而贪婪的版本? 将同样有效并且看起来“更干净”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多