这个问题在这里已有答案:
我正在使用Python 3并尝试弄清楚如何匹配美国电话号码以及可能出现的边缘情况或常见错别字。我需要能够处理各种不同的输入,并且只要长度为9位,就不能简单地排除无效数字。到目前为止,我一直在编写每个不同的场景,但是想知道是否有更简单或直接的方法来做到这一点。我也不确定是否有一种很好的方法(或至少是一种标准的方法)来解释空白的可能性。这是我到目前为止所拥有的:
#Using regex to capture different phone number formats:
^[2-9]\d{2}-\d{3}-\d{4}$ #matches a phone number in the format ANN-NNN-NNNN, where A must be between 2 and 9 and N must be between 0 and 9.
^\([2-9]\d{2}\)-\d{3}-\d{4}$ #for (ANN)-NNN-NNNN
#Edge cases:
^\([2-9]\d{2}-\d{3}-\d{4}$ #for (ANN-NNN-NNNN
^[2-9]\d{2}\)-\d{3}-\d{4}$ #for ANN)-NNN-NNNN
^[2-9]\d{2}-\d{3}\d{4}$ #for ANN-NNNNNNN
^\([2-9]\d{2}\)-\d{3}\d{4}$ #for (ANN)-NNNNNNN
^[2-9]\d{2}\d{3}-\d{4}$ #for ANNNNN-NNNN
^\([2-9]\d{2}\)\d{3}-\d{4}$ #for (ANN)NNN-NNNN
^[2-9]\d{2}\d{3}\d{4}$ #for ANNNNNNNNN
^\([2-9]\d{2}\)\d{3}\d{4}$ #for (ANN)NNNNNNN
包含所有边缘情况的修复很简单,只需通过在它们之后添加()-
来使?
可选:
test
# ['333-333-3333', '(333)-333-3333', '(333-333-3333', '333)-333-3333', '333-3333333', '(333)-3333333', '333333-3333', '(333)333-3333', '3333333333', '(333)3333333']
pattern = "^\(?[2-9]\d{2}\)?-?\d{3}-?\d{4}$"
import re
[True if re.match(pattern, x) else False for x in test]
# [True, True, True, True, True, True, True, True, True, True]