Python正则替换文件中的行

1 投票
2 回答
1054 浏览
提问于 2025-04-17 18:47

我有一个简单粗暴的构建脚本,需要更新一个小的xml配置文件中的几行内容。因为这个文件很小,所以我用了一种效率不高的方法来直接更新文件,只是为了保持简单:

def update_xml(property, value):
  for line in fileinput.input(os.path.join(app_dir, 'my.xml'), inplace=True):
    if property is 'version':
      line = re.sub(r'(<version>).*?(</version>)', '\1%s\2' % value, line, flags=re.IGNORECASE)
    elif property is 'brand':
      line = re.sub(r'(<property name="brand" type="string">).*?(</property>)', '\1%s\2' % value, line, flags=re.IGNORECASE)
    elif property is 'env':
      line = re.sub(r'(<property name="env" type="string">).*?(</property>)', '\1%s\2' % value, line, flags=re.IGNORECASE)

    print line

我遇到了两个问题:

  • 反向引用没有捕捉到我想要的内容。比如,我本来想得到 <version>a.b.c</version>,结果却得到了被控制字符包围的版本值。我试过加倍反斜杠、去掉格式化打印,还有其他一些方法,但就是搞不对。
  • 当我把这一行写回文件时(print line),出现了好几个多余的换行符。

我到底哪里搞错了呢?

2 个回答

0

使用原始字符串可以避免 \1\2 变成控制字符。你可以这样写:r'\1%s\2'

0

试着把 "\1%s\2" 替换成 \g<1>%s\g<2>,这可能就是问题所在。

关于换行,可能是打印的时候又多加了一行换行符。

你可以试试用 print line,,在后面加个逗号,这样就不会再加换行符了。

撰写回答