1

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

我首先尝试确定字符串中是否有类似 (+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']。有人对此有见识吗?非常感谢你。

4

1 回答 1

2

你的捕获组是错误的。在非捕获组中制作国家代码和捕获组中的整个表达式

>>> 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 次重复,因此空字符串也是有效匹配

于 2012-12-17T10:37:36.300 回答