鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖

[已解决]关于re.sub的空匹配问题

[复制链接]
发表于 2018-7-26 18:46:13 | 显示全部楼层
小小小小的鱼丶 发表于 2018-7-26 18:04
这个我懂。就是不能理解,findall的返回值是['', '', 'x', '', ''],那么sub(-,'abxd')是怎么替换的。为 ...

它是把findall找到的所有字符的位置换成'-'。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-26 19:16:12 | 显示全部楼层    本楼为最佳答案   
小小小小的鱼丶 发表于 2018-7-26 18:45
弱弱的问一句。。能再详细些吗。。。就是使用sub('-',abxd)的时候的替换过程。。有点愚钝

p = re.compile('x*')
p.sub('-','abxd')
'-a-b-d-'
-----------------------------------------------------
上面是代码
首先是传入正则表达式'x*’构建了一个对象p,
然后以'x*'作为匹配式来匹配 abxd 这个字符串,如果匹配到内容就替换为 -
'x*' 可以匹配到的 内容为 '' 和 x 这两个
(这个时候你要先明白我之前说的
*        匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。)的意思。
对abxd进行匹配。
1。a不满足匹配式,但a前面的 '' 满足,首先返回 '' 得到 ['']    (这时候替换成了 -a )
2。b不满足匹配式,但b前面的 '' 满足,继续返回 '' 得到 ['',''] (加1步这时候替换成了 -a-b)
3。x满足匹配式,继续返回得到 ['','','x'] (加上前两步替换撑了-a-b-)
4。d不满足匹配式,但因为前面已经匹配到了x所以直接匹配最后又一个 '' 这样就得到了['','','x',''] 最后就变成了-a-b-d-
如果这样都还不明白,你可以去下一个pycharm或者eclipse断点查看执行顺序和执行结果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-26 20:02:49 | 显示全部楼层
第一步先搜索所有可以被x*匹配的字符串(估计是使用类似于findall的算法,不过返回的不是字符串而是找到字符串在原来字符串中的位置):
首先x*匹配0~多个x,
1.a前面的''符合条件,所以加入列表
2.a后面的''符合条件,所以加入列表
以此类推……
3.'x'符合条件,所以加入列表
4.x后面的''符合条件,所以加入列表
……
所以得出->['','','x','','']
第二步把找到字符的位置记录下来
第三步找到这些位置进行替换
然后就变成了->'-a-b-d-'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-26 20:50:11 | 显示全部楼层
本帖最后由 小小小小的鱼丶 于 2018-7-26 21:09 编辑
ErTian 发表于 2018-7-26 19:16
p = re.compile('x*')
p.sub('-','abxd')
'-a-b-d-'


额。谢谢,用心了。懂了,关键在于x*能匹配‘’,这是我一直忽略的,x*匹配0次,那就是能匹配‘’!谢谢了,明白了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-27 17:59:32 | 显示全部楼层
*号表示的匹配0次躲着多次,根据你的想法,将p = re.compile('x*') p = re.compile('x+'),这样+表示至少一次或者多次,就避免了那个0次的匹配,就直接将对应的x进行替换了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-21 05:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表