python - 正则表达式编译器不匹配
问题描述
有人可以解释为什么我的编译不匹配这个字符串。我只是得到一个空列表。
我也尝试使用 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")
解决方案
您当前方法的主要问题与您当前的正则表达式模式中有三个捕获组有关。 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
请注意,这[ -]
是一个字符类,表示一个字符,它可以是空格或破折号。
推荐阅读
- security - 我收到了一封电子邮件(gmail),如果发件人和收件人都使用相同的域,如何知道发件人的 IP 地址
- javascript - 在映射 ReactJS 中未调用组件
- kubernetes - Helm 在 Amazon EKS 上安装 Fluentd-Cloudwatch
- c++ - 为什么没有 std::uninitialized_move_if_noexcept?
- mysql - MySQL 在解释语句中声明时不使用我的索引
- ios - 将字典数组转换为对象数组
- java - Java SQL 时间戳到 ZonedDateTime
- javascript - 意味着堆栈控制台在终端中不起作用
- c# - 将字节转换为图像时分辨率被破坏?
- video - 播放youtube视频后如何隐藏和观看以后的相关视频