我正在编写符合美国电话号码格式的代码
所以它应该匹配:
123-333-1111
(123)111-2222
123-2221111
但不应该匹配 1232221111
matchThreeDigits = r"(?:\s*\(?[\d]{3}\)?\s*)"
matchFourDigits = r"(?:\s*[\d]{4}\s*)"
phoneRegex = '('+ '('+ matchThreeDigits + ')' + '-?' + '('+ matchThreeDigits + ')' + '-?' + '(' + matchFourDigits + ')' +')';
matches = re.findall(re.compile(phoneRegex),line)
问题是我需要确保模式中存在()或“ - ”中的至少一个(或者它可以是九位数而不是电话号码)。出于效率原因,我不想再进行其他模式搜索。有没有办法在正则表达式模式中容纳这些信息。
答案 0 :(得分:3)
您可以使用以下正则表达式:
regex = r'(?:\d{3}-|\(\d{3}\))\d{3}-?\d{4}'
假设(123)1112222
可以接受。
|
分别作为或\(
和\)
转义(
和)
。
答案 1 :(得分:3)
这样的东西?
pattern = r'(\(?(\d{3})\)?(?P<A>-)?(\d{3})(?(A)-?|-)(\d{4}))'
使用它:
import re
regex = re.compile(pattern)
check = ['123-333-1111', '(123)111-2222', '123-2221111', '1232221111']
for number in check:
match = regex.match(number)
print number, bool(match)
if match:
# show the numbers
print 'nums:', filter(lambda x: x and x.isalnum(), match.groups())
>>>
123-333-1111 True
nums: ('123', '333', '1111')
(123)111-2222 True
nums: ('123', '111', '2222')
123-2221111 True
nums: ('123', '222', '1111')
1232221111 False
注意:强>
您要求解释:(?P<A>-)
和(?(A)-?|-)
(?P<A>-)
:名为A
,(?P<NAME> ... )
(?(A)-?|-)
:是否检查命名组A
是否捕获了某些内容的组,如果是,则执行YES,否则执行NO捕获。 (?(NAME)YES|NO)
如果您在Python解释器中执行简单的help(re)
,或者在Python中搜索Python正则表达式,则可以轻松学习所有这些....
答案 2 :(得分:2)
import re
phoneRegex = re.compile("(\({0,1}[\d]{3}\)(?=[\d]{3})|[\d]{3}-)([\d]{3}[-]{0,1}[\d]{4})")
numbers = ["123-333-1111", "(123)111-2222", "123-2221111", "1232221111", "(123)-111-2222"]
for number in numbers:
print bool(re.match(phoneRegex, number))
<强>输出强>
True
True
True
False
False
您可以在此处查看此正则表达式的说明:http://regex101.com/r/bA4fH8