Python3:使用re.sub删除文本文件中指定开头的行未生效
代码失效的具体原因
- 核心逻辑错误:
re.sub()不会原地修改传入的字符串,Python的字符串是不可变类型,所有字符串方法都会将处理后的新内容作为返回值返回,你之前调用正则方法时没有把返回值赋值给data,相当于执行了一行没有任何实际作用的空代码,自然不会产生任何修改效果。 - 正则规则错误:你写的匹配规则
r'^ line_to_delete .*\n?'中,^(行首锚点)和line_to_delete之间多了一个空格,实际需要删除的行是直接以line_to_delete开头的,这个多余的空格会导致正则完全匹配不上目标行。 - 细节疏漏:你之前通过replace插入的换行是Windows系统的
\r\n格式,正则里只单独匹配\n的话,替换完成后会残留孤立的\r不可见字符;另外你注释掉的那行不带re.MULTILINE参数的正则本身逻辑就不对——没有开启多行模式时,^只会匹配整个文本的最开头,前置带.的写法也会错误抓取行首的任意字符,根本定位不到需要删除的整行。
修正后的实现代码
import re # 用上下文管理器打开文件,自动处理句柄释放,无需手动调用close with open("Data.txt", "rt", encoding="utf-8") as fin: data = fin.read() # 执行原有内容替换逻辑 data = data.replace(',', '\r\n,') data = data.replace('`:', '`:\r\nline_to_delete') # 修正点: # 1. 将re.sub的返回值赋值回data # 2. 去掉正则里^后面多余的空格 # 3. 兼容匹配\r\n格式的换行,把整行连换行符一起删除,避免残留 data = re.sub(r'^line_to_delete.*\r?\n?', '', data, flags=re.MULTILINE) # 写入修改后的文件 with open("DataModified.txt", "wt", encoding="utf-8") as fout: fout.write(data)
*补充提示:
- 代码里导入的
mysql.connector、os、sys、string模块如果后续没有相关逻辑,可以删掉减少冗余。 - 用上下文管理器打开文件可以自动处理文件句柄的释放,比手动调用
close()的写法更稳妥,能避免异常场景下文件没正常关闭的问题。 - 如果不需要严格保留原来的Windows换行格式,也可以统一把换行替换为通用的
\n,减少格式残留。*
内容的提问来源于stack exchange,提问作者Mauro Telani
相关产品推荐
相关产品推荐

