re 模块, 正则表达式 w+d+ 的重复问题引发的题目解析

Posted shijieli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了re 模块, 正则表达式 w+d+ 的重复问题引发的题目解析相关的知识,希望对你有一定的参考价值。

题目

计算以下代码的结果

s = "?!.18)dajslj$12.15613sdadw.123sdasda35615.168sndsda$15.6sdasd.sdfsdgw123.156s"

p1 = re.compile("\\w+\\.\\w+\\d+\\.+\\d+")
print(p1.findall(s)) 

p1 = re.compile("(\\w+)\\.(\\w+)((\\d+)\\.+\\d+)")
print(p1.findall(s))  

答案

# [‘3265sdadw.sdasda35615.168‘, ‘6sdasd.sdfsdgw123.156‘]

# [(‘3265sdadw‘, ‘sdasda3561‘, ‘5.168‘, ‘5‘), (‘6sdasd‘, ‘sdfsdgw12‘, ‘3.156‘, ‘3‘)]

解析

本题考查 正则分组优先原则以及输出格式

附带考查 \\w+ \\d+ 重复匹配问题

思考

第一个  \\d+ 为什么匹配到的是 5? 不应该是 35615吗?

如果是认为是 35615 应该是产业以下两种分析方式

方式一

技术图片

很明显 \\w+ 可以匹配数字字母下划线所以 后面的 35615 都是属于 \\w+ de 匹配范围,所以这个分析方式绝对是错的

 方式二

技术图片

 这个分析方式已经基本上都对了, 但是在 \\w+\\d+ 一起对数字的处理的时候, 是使用的最小回退, 即值给一位给 \\d+ 所以不会全部把35615给他

正确方式

 技术图片

最开始的"12" 为什么不会被 \\w+ 匹配成功?

技术图片

看起来这样子匹配是可以的,貌似。

但是 第二个 \\w+\\d+ 是链接在一起的, 即是要求必须\\w+后面有数字,因此 \\w+\\d+、 就只能匹配到 15313, 然后就没小数点就没办法匹配下去了。

所以是匹配不成功的。

 

以上是关于re 模块, 正则表达式 w+d+ 的重复问题引发的题目解析的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式re模块

python模块之re正则表达式

Python实战之正则表达式RE/re学习笔记及简单练习

正则,re模块

正则表达式和re模块

re模块