我有一个巨大的XML文件(大约100MB),每行包含<tag>10005991</tag>
行。例如:
textextextextext<tag>10005991<tag>textextextextext
textextextextext<tag>20005992</tag>textextextextext
textextextextext<tag>10005993</tag>textextextextext
textextextextext<tag>20005994</tag>textextextextext
我想替换标签之间的任何字符串,并以“1”开头替换为我选择的字符串,然后写回文件。我已经尝试使用line.replace函数,但只有在我指定字符串时才有效。
line=line.replace("<tag>10005991</tag>","<tag>YYYYYY</tag>")
理想输出:
textextextextext<tag>YYYYYY<tag>textextextextext
textextextextext<tag>20005992</tag>textextextextext
textextextextext<tag>YYYYYY</tag>textextextextext
textextextextext<tag>20005994</tag>textextextextext
我已经考虑使用数组传递每个字符串然后替换,但我确信有一个更简单的解决方案。
答案 0 :(得分:2)
您可以使用re
module
>>> text = 'textextextextext<tag>10005991</tag>textextextextext'
>>> re.sub(r'<tag>1(\d+)</tag>','<tag>YYYYY</tag>',text)
'textextextextext<tag>YYYYY</tag>textextextextext'
re.sub
将使用第二个参数替换匹配的文本。
来自文档的引用
返回通过替换repl替换字符串中最左边非重叠模式而获得的字符串。如果找不到模式,则返回字符串不变。
用法可能如下:
with open("file") as f:
for i in f:
with open("output") as f2:
f2.write(re.sub(r'<tag>1(\d+)</tag>','<tag>YYYYY</tag>',i))
答案 1 :(得分:2)
您可以使用正则表达式,但由于您有多行字符串,因此需要使用re.DOTALL
标记,并且在您的模式中,您可以使用positive look-around作为标记之间的匹配字符串:
>>> print re.sub(r'(?<=<tag>)1\d+(?=</?tag>)',r'YYYYYY',s,re.DOTALL,re.MULTILINE)
textextextextext<tag>YYYYYY<tag>textextextextext
textextextextext<tag>20005992</tag>textextextextext
textextextextext<tag>YYYYYY</tag>textextextextext
textextextextext<tag>20005994</tag>textextextextext
re.DOTALL
制作'。'特殊字符匹配任何字符,包括换行符;没有这个标志,'。'将匹配除换行符之外的任何内容。
同样@Bhargav Rao在他的回答中做了你可以使用分组而不是环顾四周:
>>> print re.sub(r'<tag>(1\d+)</?tag>',r'<tag>YYYYYY</?tag>',s,re.DOTALL,re.MULTILINE)
textextextextext<tag>YYYYYY</?tag>textextextextext
textextextextext<tag>20005992</tag>textextextextext
textextextextext<tag>YYYYYY</?tag>textextextextext
textextextextext<tag>20005994</tag>textextextextext
答案 2 :(得分:1)
我认为最好的办法是使用ElementTree
主要观点: 1)解析文件 2)找到元素值 3)测试你的病情 4)如果满足条件,则替换值
这是开始解析的好地方:How do I parse XML in Python?