Products
GG网络技术分享 2025-03-18 16:14 4
大佬们,我是一个刚学Python的新手,最近看到正则表达式,有一个问题百思不得其解。就是图片里的这个字符串“127.0.0.1 192.168.1.66”,按照书中所写r"[1-9]{1,3}(\\.[0-9]{1,3}{3}",匹配到的应该是(\\.[0-9]{1,3})的结果,但是代码运行之后只有.1和.66为啥没有.0呀,这个不是也符合条件吗
import re
pattern=r'[1-9]{1,3}(\\.[0-9]{1,3}){3}'str1='127.0.0.1 192.168.1.66'match=re.findall(pattern,str1)
print(match)
findall()函数有个特点,当正则表达式中有子匹配时,会忽略整体匹配的结果。只会获取子匹配的结果。
因为你正则表达式中()子匹配只有一个,只能保留一个子匹配的结果,
(.[0-9]{1,3})是正则中第一个子匹配,虽然这第一个子匹配重复匹配了3次。但是获取子匹配的结果都是第一次子匹配的结果,同一个子匹配只能保留一个结果,后面获取的会覆盖前面的。
图呢
.?里,"."代表匹配任意非换行符的字符,""代表匹配前一个字符0至无限次,"?"代表把前面的"*"转化为非贪婪模式,就是说尽可能少匹配。
单纯而言,".*"就可以匹配"abc"或者"小王"了。
用"?"转化为非贪婪模式是为了能够匹配两次。举个例子,用"a.*?a"去匹配"abbbaaaba",会匹配到前五位的"abbba",而用"a.*a"来匹配会直接匹配到整个"abbbaaaba"。
这里的应用场景看起来是html的内容,正则表达式在".*"的前后都有<div>的tag,所以是期望能够匹配到某一个单独的<div>的前后tag。如果使用了贪婪模式,那正则表达式前后的<div>就有可能匹配到横跨好几个div的前后tag了。
Demand feedback