正则表达式来提取电话号码

时间:2012-12-17 10:21:58

标签: python regex

我是正则表达式的新手,我正在尝试编写电话号码模式,以便识别它们并能够提取它们。我的疑问可归纳为以下简单示例:

我首先尝试确定字符串中是否有类似(+34)的内容应该是可选的:

prefixsrch = re.compile(r'(\(?\+34\)?)?')

我按以下方式测试以下字符串:

line0 = "(+34)"
print prefixsrch.findall(line0)

产生结果:

  

[ '(+ 34)', '']   我的第一个问题是:为什么会发现两种模式?我想这与前缀是可选的事实有关,但我并不完全理解它。无论如何,现在我怀疑了

如果我们在搜索9位数的模式时做了类似的事情,我们会得到相同的结果:

numsrch = re.compile(r'\d{9}')
line1 = "971756754"
print numsrch.findall(line1)

产生类似的东西:

  

[ '971756754']

哪个好。现在我要做的是识别一个9位数字,先于或不在前,由(+34)。所以根据我的理解,我应该做一些事情:

phonesrch = re.compile(r'(\(?\+34\)?)?\d{9}')

如果我在以下字符串中测试它......

line0 = "(+34)971756754"
line1 = "971756754"

print phonesrch.findall(line0)
print phonesrch.findall(line1)

令我惊讶的是,我得到的是:

[ '(+ 34)'] [ '']

我期待得到的是['(+34)971756754']和['971756754']。有人有这方面的见解吗?非常感谢你。

1 个答案:

答案 0 :(得分:1)

您的捕获组错了。在非捕获组中创建国家/地区代码,在捕获组中创建整个表达式

>>> line0 = "(+34)971756754"
>>> line1 = "971756754"
>>> re.findall(r'((?:\(?\+34\)?)?\d{9})',line0)
['(+34)971756754']
>>> re.findall(r'((?:\(?\+34\)?)?\d{9})',line1)
['971756754']


 My first question is: why does it find two occurrences of the pattern?

这是因为,?表示匹配0或1次重​​复,所以空字符串也是有效匹配