如何用Python正则表达式修改Toml文件指定字段的参数值
仅修改Toml指定字段内参数的Python正则方案
要精准修改[tool.poetry]区块内的name参数,核心是限定正则的匹配范围——只在目标区块的内容中查找name字段,而非全局匹配所有同名参数。
正则表达式编写
使用以下正则可精准定位目标区块内的name参数:
reg_name = r'(?<=\[tool\.poetry\]\n)(.*?)(name\s*=\s*".*?")(.*?)(?=\n\[|\Z)'
正则逻辑拆解
(?<=\[tool\.poetry\]\n):正向断言,确保匹配起始于[tool.poetry]行之后(.*?):非贪婪匹配区块内name字段之前的所有内容(兼容换行)(name\s*=\s*".*?"):精准匹配name参数行,支持等号前后有空格,捕获引号内的旧值(.*?):非贪婪匹配name字段之后到区块结束前的所有内容(?=\n\[|\Z):正向断言,确保匹配结束于下一个区块(\n[)或者文件末尾(\Z)
Python代码示例
import re # 读取Toml文件内容 with open('pyproject.toml', 'r', encoding='utf-8') as f: content = f.read() # 目标新名称 new_name = "my-new-package" # 正则表达式 reg_name = r'(?<=\[tool\.poetry\]\n)(.*?)(name\s*=\s*".*?")(.*?)(?=\n\[|\Z)' # 自定义替换逻辑:保留区块前后内容,替换name行 def replace_name(match): prefix = match.group(1) new_name_line = f'name = "{new_name}"' suffix = match.group(3) return prefix + new_name_line + suffix # 执行替换,开启DOTALL让.匹配换行符 updated_content = re.sub(reg_name, replace_name, content, flags=re.DOTALL) # 写入修改后的内容 with open('pyproject.toml', 'w', encoding='utf-8') as f: f.write(updated_content)
适配说明
- 如果你的Toml中
name参数使用单引号,可把正则里的"替换为['"],兼容两种引号格式 - 若区块内存在注释或复杂格式,可根据实际情况微调正则的匹配规则
内容的提问来源于stack exchange,提问作者Oliver Guo
相关产品推荐
相关产品推荐

