Python正则替换文件中的行
我有一个简单粗暴的构建脚本,需要更新一个小的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,
,在后面加个逗号,这样就不会再加换行符了。