我有一个字符串,其中包含带有标签的整个XML文档。我想替换实际文本中的单词,而不是标签中的单词,并多次执行此操作,同时忽略标签中的匹配术语,同时防止在插入的标签中进行替换。 (下面的示例)。
更详细地:
我有一个CSV文件,其中包含“ ID,term”,我想用<eurovoc_id = 1>publication</eurovoc_id>
替换XML文件中的这些术语(例如“ publication”),其中“ 1”是我的CSV文件中的ID和“ publication” ”一词。我实际要替换的术语列表大约有7000个条目,按其长度从最长到最短的顺序排序(我知道这意味着每个文档/字符串都被处理7000次,不幸的是,我也没有解决方案)。目前,我的脚本使用第一个术语,将其替换为整个字符串,然后使用第二个术语,并从字符串的开头重新开始,直到所有术语都被替换为止。
不幸的是,这会产生一些意想不到的影响:
<eurovoc_id = 1>
标记,一旦到达“ euro”之类的术语,脚本就会替换该标记的一部分,从而产生<<eurovoc_id = 3>euro</eurovoc_id>
。我试图用不同的正则表达式解决这个问题,以排除尖括号内的单词,并排除eurovoc_id内的单词,但没有一个起作用。这有可能吗?
示例:
CSV:
"1, publication
2, EFTA
3, euro
4, ..."
XML字符串:
<?xml version="1.0" encoding="UTF-8" ?>
<DOC xsi:noNamespaceSchemaLocation="http://formex.publications.eu.int/schema/formex-01.01-20040501.xd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<PUBLICATION.REF FILE="C_2004094EN.toc.xml">
<COLL>C</COLL>
</PUBLICATION.REF>
<P>Judgment of the Court (Second Chamber) <DATE ISO="20040304">4 March 2004</DATE> More text containing the words publication and EFTA</P>
</DOC>
所需的XML字符串:
<?xml version="1.0" encoding="UTF-8" ?>
<DOC xsi:noNamespaceSchemaLocation="http://formex.publications.eu.int/schema/formex-01.01-20040501.xd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<PUBLICATION.REF FILE="C_2004094EN.toc.xml">
<COLL>C</COLL>
</PUBLICATION.REF>
<P>Judgment of the Court (Second Chamber) <DATE ISO="20040304">4 March 2004</DATE> More text containing the words <eurovoc_id = 1>publication</eurovoc_id> and <eurovoc_id = 2>EFTA</eurovoc_id></P>
</DOC>
该脚本应仅在<P>
标签内标记“ publication”和“ EFTA”(但是,用<P>
标签标记这些术语并非总是如此)。
我当时的想法是使用正则表达式,例如:
re.compile(r'STUFF' + re.escape(element[1]) + r'STUFF', re.IGNORECASE|re.MULTILINE)
其中element[1]
是要替换的当前术语(在for循环中更新),而STUFF应该是防止在内部变量(<TERM>
)和eurovoc_id标签之间({{1})之间进行替换的表达式。 }。