我正在尝试仅匹配字符串中存在的北美数字; (123)456-7890和123-456-7890都是北美电话号码可接受的显示格式,这意味着其他任何模式都不应匹配。
注意:正在使用python3.7和pycharm编辑器。
以下是用字符串表示的电话号码:
123-456-7890
(123)456-7890
(123)-456-7890
(123-456-7890
1234567890
123 456 7890
我尝试使用(\()?\d{3}(?(1)\)|-)\d{3}-\d{4}
正则表达式,该正则表达式确实使用了反向引用条件来匹配所需的电话号码,以下是python代码:
import regex
st = """
123-456-7890
(123)456-7890
(123)-456-7890
(123-456-7890
1234567890
123 456 7890
"""
pat = regex.compile(r'(\()?\d{3}(?(1)\)|-)\d{3}-\d{4}', regex.I)
out = pat.findall(st)
print(out)
使用findall方法输出:['','(','']
使用search(st).group()方法输出,仅返回第一个匹配项:123-456-7890
匹配项应为:
123-456-7890 (123)456-7890
我的问题是:为什么findall方法应该像在regex 101 website中那样完美地返回匹配的模式,现在是否会返回诸如['', '(', '']
这样的令人讨厌的结果?
我已经在regex 101 website中尝试过正则表达式,它可以完美运行,但不适用于此。
注意:我正在使用sams自学正则表达式书,在第134页中,建议了此问题的最佳解决方案,而以上是python的实现。
答案 0 :(得分:1)
您的正则表达式是正确的,但是如果您使用findall
,它将自动打印所有捕获的组。最好使用finditer
并打印.group()
或.group(0)
:
>>> pat = regex.compile(r'^(\()?\d{3}(?(1)\)|-)\d{3}-\d{4}$', regex.M)
>>> for m in pat.finditer(st):
... print (m.group())
...
123-456-7890
(123)456-7890
答案 1 :(得分:1)
使用修饰符:
print(list(pat.finditer(st)))