Python 2.7中用正则在列表插入换行失效问题排查
问题排查与解决方案
看起来你的代码主要有几个小问题导致替换只“生效一次”的错觉,我来帮你拆解并修正:
核心问题分析
仅写入匹配开头的行,丢失其他内容
你的循环里只有当aanvr.match(line)返回True时才会写入文件,那些不满足开头匹配的行(比如空行、或者编号不在行首的行)都被直接跳过了,最终文件里只保留了少数被处理的行,看起来像是替换只生效了一次。match()方法的局限性match()只会从字符串的起始位置匹配正则,如果某一行里包含多个编号(比如一行里有两个数字-数字的模式),它只会识别开头的那个;如果编号不在行首,这行直接不会被处理。替换逻辑可能不符合预期
你当前的替换是把数字-数字改成数字-数字\n,如果你的目标是让每个编号对应的条目单独成一行,这个替换方向需要调整。
修正后的代码
import re # 使用with语句自动管理文件打开/关闭,更安全 with open('outputtest2.txt', 'r') as input_file, open('outputtest3.txt', 'w') as output_file: # 读取所有行 all_lines = input_file.readlines() # 编译正则:匹配所有带前置空格的「数字-数字」模式 num_pattern = re.compile(r" ([0-9]+-[0-9]+)") for line in all_lines: # 对每一行的所有匹配项进行替换:在编号前插入换行,让每个条目单独成行 # 如果你的需求是其他替换逻辑,可以修改这里的替换字符串 processed_line = num_pattern.sub(r"\n\g<1>", line) # 写入处理后的行,确保所有内容都被保留 output_file.write(processed_line)
关键修改说明
- 全量处理所有行:去掉了
match()的判断,对每一行都执行替换操作,不管编号在什么位置,也不会丢失任何原始内容。 - 替换逻辑优化:把替换字符串改成
r"\n\g<1>",这样每个数字-数字都会被替换成\n数字-数字,直接在编号前插入换行,让每个编号对应的条目自动拆分到单独的行。 - 更安全的文件管理:用
with语句处理文件,避免手动关闭文件时可能出现的遗漏。
测试建议
如果你的原始文本中有类似这样的行:
525-11 Prof.Dr.F.J.A.Kreuzer, Nijmegen ... 527-7 Dr.G.Buyze, Utrecht ...
修正后的代码会把它处理成:
525-11 Prof.Dr.F.J.A.Kreuzer, Nijmegen ...
527-7 Dr.G.Buyze, Utrecht ...
这样每个条目就会单独成一行,完美生成你需要的有序数据集。
内容的提问来源于stack exchange,提问作者Digital Historian
相关产品推荐
相关产品推荐

