编辑来自不同行的两个字符串之间的文本

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)