我是正则表达式的新手,我正在尝试编写电话号码模式,以便识别它们并能够提取它们。我的疑问可归纳为以下简单示例:
我首先尝试确定字符串中是否有类似(+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']。有人有这方面的见解吗?非常感谢你。
答案 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次重复,所以空字符串也是有效匹配