Python 正则表达式编译器不匹配

Python 正则表达式编译器不匹配,python,regex,phone-number,Python,Regex,Phone Number,有人能解释一下为什么我的编译器与这个字符串不匹配吗。 我只是得到一张空名单 我也尝试过使用详细模式 第一部分(+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") 当前方法

有人能解释一下为什么我的编译器与这个字符串不匹配吗。 我只是得到一张空名单

我也尝试过使用详细模式

第一部分(+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")

当前方法的主要问题与当前正则表达式模式中有三个捕获组有关。
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']
为完整起见,以下是regex更新版本的说明:

(?:\+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

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

使用非捕获组
(?:\+45)?[-\s]?\d\d\d\d[-\s]?\d\d\d
使用返回捕获组的值。
(?:-\s)的情况相同
但是括号和冒号是干什么的呢?我正在Udemy上的“自动化枯燥的东西”课程,他没有提到任何关于它们的内容。我也在谷歌上查过,但什么都没有找到,除了你如何使用反斜杠来转义它并生成一个文字括号或冒号。@Mads我已经添加了一个关于regex如何工作的更详细的解释惯性导航与制导。