如何用Python正则匹配并删除INI文件中的[FILES]多行区块
解决INI文件[FILES]区块正则匹配错误问题
问题原因
你当前的正则存在两个核心问题:
- 没有设置匹配停止边界,匹配到[FILES]后不会自动在下一个区块开头停止
- 字符范围
[$-_a-zA-Z0-9\/\.\n\r]中,$-_的范围在ASCII编码中包含了[字符,会把后续区块的[PQR]这类开头也纳入匹配范围,导致吞掉后续所有内容
修正方案
使用非贪婪匹配+正向前瞻断言限制匹配范围,仅匹配[FILES]区块本身,遇到下一个[开头的区块或者文件末尾就自动停止:
正则表达式为:r'^\[FILES\]\r?\n(?:.*\r?\n)*?(?=\[|\Z)'
参数说明:
re.MULTILINE保证^可以匹配每一行的行首\r?\n同时兼容Windows和Unix格式的换行符(?:.*\r?\n)*?非贪婪匹配任意多行内容,非捕获组不占用分组位置(?=\[|\Z)正向前瞻断言,匹配到下一个[开头的行或者文件结束位置就停止,不会吃掉后续区块内容
完整代码示例
import re import configparser # 读取原始INI文件 with open('my.ini', 'r', encoding='utf-8') as f: raw_data = f.read() # 编译正则并删除[FILES]区块 pattern = re.compile(r'^\[FILES\]\r?\n(?:.*\r?\n)*?(?=\[|\Z)', flags=re.MULTILINE) clean_data = pattern.sub('', raw_data) # 清理后的数据可直接用configparser正常解析 cfg = configparser.ConfigParser() cfg.read_string(clean_data) # 测试解析结果 print(cfg.sections()) # 输出: ['ABC', 'DEF', 'PQR']
内容的提问来源于stack exchange,提问作者A.G.Progm.Enthusiast
相关产品推荐
相关产品推荐

