首页 > 解决方案 > 正则表达式编译器不匹配

问题描述

有人可以解释为什么我的编译不匹配这个字符串。我只是得到一个空列表。

我也尝试使用 VERBOSE 模式。

第一部分(+45)应该是可选的(因此?)

然后下一行可以是破折号或空格(我尝试制作一个常规空格,但这也不起作用。这也是可选的

然后是四位数

然后是另一个分隔符,也是可选的

然后是最后 4 位数字。

import re
b = re.compile(r"(\+45)?(-|\s)?\d\d\d\d(-|\s)?\d\d\d\d")
b.findall("+45 2222 2222 is")

标签: pythonregexphone-number

解决方案


您当前方法的主要问题与您当前的正则表达式模式中有三个捕获组有关。 re.findall根据您拥有的捕获组,行为会有所不同。由于您想从整个模式中捕获匹配项,因此您不应该有任何捕获组。三个组中的两个甚至都不需要,所以我在下面删除了它们。对于可选的国家代码,我使用 . 关闭了捕获组?:

import re
b = re.compile(r'(?:\+45)?[ -]?\d{4}[ -]?\d{4}')
m = b.findall("+45 2222 2222 is")
print(m)

这打印:

['+45 2222 2222']

为了完整起见,这里是正则表达式更新版本的解释:

(?:\+45)?    match an optional leading '+45' country code
[ -]?        match either a space or a dash, zero or one time
\d{4}        match 4 digits
[ -]?        match another space or a dash, zero or one time
\d{4}        match 4 more digits

请注意,这[ -]是一个字符类,表示一个字符,它可以是空格或破折号。


推荐阅读