编辑来自不同行的两个字符串之间的文本
Editing text between two strings from different lines
我想编辑 xml 文件中的属性值并将每个“\n”替换为“(换行符)\n”。这是必要的,因为我需要在解析后保留 xml 文件的结构,它被标准化并且空格消失了,所以我想首先在空格之前添加像“换行符”这样的字符串,所以在解析 xml 文件,当它被标准化并且空格消失时,我将编辑整个文件并将字符串“(换行符)”替换回单个“\n”。
下图显示了我想做的事情:
我尝试使用正则表达式获取“value=”和“/>”之间的文本,但我只能获取一行中的值,而且我什至不知道如何编辑它。
import re
with open("file", "r") as f:
contents = f.readlines()
for line in contents:
result = re.search('value=(.*?) />', line)
print(result)
有我的文件:
<Module bs="Mainfile_1">
<object id="1000" name="namex" number="1">
<item name="item0" value="100"/>
<item name="item00" value="100
100"/>
</object>
<object id="1001" name="namey" number="2">
<item name="item1" value="100"/>
<item name="item00" value="100"/>
</object>
<object id="1234" name="name1" number="3">
<item name="item1" value="FAIL"/>
<item name="item2" value="233"/>
<item name="item3" value="233
234
246"/>
<item name="item4" value="FAIL"/>
</object>
<object id="1238" name="name2" number="4">
<item name="item8" value="FAIL"/>
<item name="item9" value="233
234
245
246
267"/>
</object>
<object id="2345" name="name32" number="5">
<item name="item1" value="111"/>
<item name="item2" value="FAIL" />
</object>
<object id="2347" name="name4" number="6">
<item name="item1" value="FAIL"/>
<item name="item2" value="FAIL"/>
<item name="item3" value="233"/>
<item name="item4" value="FAIL"/>
</object>
</Module>
您可以将 re.sub 与回调一起使用。
然后回调可以根据需要修改匹配的字符串。这里将所有 \n
替换为 (newline)\n
.
在您的代码中,您逐行遍历文件的内容。这就是为什么您的正则表达式只能匹配一行。使用 f.read() 获取一个字符串中的全部内容。
综合起来:
import re
def newlinerepl(matchobj):
return matchobj.group(0).replace("\n", "(newline)\n")
with open("file", "r") as f:
contents = f.read()
result = re.sub('value="([^"]*)"', newlinerepl, contents)
print(result)
我想编辑 xml 文件中的属性值并将每个“\n”替换为“(换行符)\n”。这是必要的,因为我需要在解析后保留 xml 文件的结构,它被标准化并且空格消失了,所以我想首先在空格之前添加像“换行符”这样的字符串,所以在解析 xml 文件,当它被标准化并且空格消失时,我将编辑整个文件并将字符串“(换行符)”替换回单个“\n”。
下图显示了我想做的事情:
我尝试使用正则表达式获取“value=”和“/>”之间的文本,但我只能获取一行中的值,而且我什至不知道如何编辑它。
import re
with open("file", "r") as f:
contents = f.readlines()
for line in contents:
result = re.search('value=(.*?) />', line)
print(result)
有我的文件:
<Module bs="Mainfile_1">
<object id="1000" name="namex" number="1">
<item name="item0" value="100"/>
<item name="item00" value="100
100"/>
</object>
<object id="1001" name="namey" number="2">
<item name="item1" value="100"/>
<item name="item00" value="100"/>
</object>
<object id="1234" name="name1" number="3">
<item name="item1" value="FAIL"/>
<item name="item2" value="233"/>
<item name="item3" value="233
234
246"/>
<item name="item4" value="FAIL"/>
</object>
<object id="1238" name="name2" number="4">
<item name="item8" value="FAIL"/>
<item name="item9" value="233
234
245
246
267"/>
</object>
<object id="2345" name="name32" number="5">
<item name="item1" value="111"/>
<item name="item2" value="FAIL" />
</object>
<object id="2347" name="name4" number="6">
<item name="item1" value="FAIL"/>
<item name="item2" value="FAIL"/>
<item name="item3" value="233"/>
<item name="item4" value="FAIL"/>
</object>
</Module>
您可以将 re.sub 与回调一起使用。
然后回调可以根据需要修改匹配的字符串。这里将所有 \n
替换为 (newline)\n
.
在您的代码中,您逐行遍历文件的内容。这就是为什么您的正则表达式只能匹配一行。使用 f.read() 获取一个字符串中的全部内容。
综合起来:
import re
def newlinerepl(matchobj):
return matchobj.group(0).replace("\n", "(newline)\n")
with open("file", "r") as f:
contents = f.read()
result = re.sub('value="([^"]*)"', newlinerepl, contents)
print(result)