python“ regex”和“ re”模块中的“ backrefrence条件”无法按预期运行

时间:2019-11-30 12:26:32

标签: python regex

我正在尝试仅匹配字符串中存在的北美数字; (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的实现。

2 个答案:

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