如何在python中有效地匹配正则表达式

时间:2013-11-06 08:05:54

标签: python regex

我正在编写符合美国电话号码格式的代码

所以它应该匹配:

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)

问题是我需要确保模式中存在()或“ - ”中的至少一个(或者它可以是九位数而不是电话号码)。出于效率原因,我不想再进行其他模式搜索。有没有办法在正则表达式模式中容纳这些信息。

3 个答案:

答案 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