Python零基础 正则表达式 请各位前辈帮忙解释一下,谢谢
>>> s1 = re.findall(r'((?\d?\d|2\d|25)\.){3}(?\d?\d|2\d|25)','204.192.168.1')>>> s1
[('168.', '168', '1')]
想知道,[('168.', '168', '1')],这个结果
是r'((?\d?\d|2\d|25)\.){3}(?\d?\d|2\d|25)'这个部分怎么匹配出来的?
我的理解是:((?\d?\d|2\d|25)\.){3},这个部分以(?\d?\d|2\d|25)\.为分组,整体匹配了3次
而(?\d?\d|2\d|25) 这个里面是 或的关系,可以匹配9或者244或者251或者99或者199
如果是这样的话,那为什么匹配出来的结果,不是我想要的那种
谢谢指教
走过路过的,如果知道的,希望你能帮忙解答一下,谢谢了 正则表达式是一个非常强大的工具,但在有些时候它并不能直观地按照你的意愿来运行。
出现这样的情况,我的理解是每个小括号代表一个子组,3个小括号,findall误认为有三个子组
findall():返回的是所有groups的列表,就是group组成的元组的列表,母串中的这一撮组成一个元组,那一撮组成一个元组,这些元组共同构成一个list。举个例子:
>>> s = '23432werwre2342werwrew'
>>> p = r'(\d*)(*)'
>>> m = re.findall(p,s)
>>> print(m)
[('23432', 'werwre'), ('2342', 'werwrew'), ('', '')]
>>> s='1113446777'
>>> m = re.findall(r'(\d)\1*',s)
>>> print(m)
['1', '3', '4', '6', '7']
你可以这样改:
s = '204.192.168.1'
p = re.compile(r'((?\d?\d|2\d|25)\.){3}(?\d?\d|2\d|25)')
m = p.match(s) 或者 m = p.search(s)
print(m)
这里有个bug,200以上的数字会截取前两位,20会满足 ?\d?\d 中的 \d?\d 直接输出,所以要将匹配200以上的语句放在前面就行了
来自星星的小明 发表于 2022-5-24 16:07
正则表达式是一个非常强大的工具,但在有些时候它并不能直观地按照你的意愿来运行。
出现这样的情况,我的 ...
谢谢你的答复!!
?\d?\d 中的 \d?\d 直接输出
你说的这个情况我之前也发现了,你说的findall误认为有三个子组我也明白
只是,我搞不懂这三个子组是怎样和IP地址匹配的,例如192.120.58.245
哪个子组匹配哪个部分你可以说一下吗?有点懵
第二个懵的地方就是,关于((?\d?\d|2\d|25)\.){3},这个部分重复操作3次,应该怎么理解呢?
这重复操作3次,对应IP地址是对应了哪里?
不吝赐教,再次感谢!! >>> str = '192.120.58.245'
>>> p1 = r'((\d*)\.)(\d*)'
>>> re.findall(p1,str)
[('192.', '192', '120'), ('.', '', '58'), ('.', '', '245')]
>>> p2 = r'((\d*)\.){1}(\d*)'
>>> re.findall(p2,str)
[('192.', '192', '120'), ('.', '', '58'), ('.', '', '245')]
>>> p3 = r'((\d*)\.){2}(\d*)'
>>> re.findall(p3,str)
[('120.', '120', '58')]
>>> p4 = r'((\d*)\.){3}(\d*)'
>>> re.findall(p4,str)
[('58.', '58', '245')]
这样你能看懂不
页:
[1]