多次替换而不替换新插入的单词和尖括号(标签)中的单词

时间:2018-07-27 09:52:17

标签: regex xml python-3.x xml-parsing substitution

我有一个字符串,其中包含带有标签的整个XML文档。我想替换实际文本中的单词,而不是标签中的单词,并多次执行此操作,同时忽略标签中的匹配术语,同时防止在插入的标签中进行替换。 (下面的示例)。

更详细地: 我有一个CSV文件,其中包含“ ID,term”,我想用<eurovoc_id = 1>publication</eurovoc_id>替换XML文件中的这些术语(例如“ publication”),其中“ 1”是我的CSV文件中的ID和“ publication” ”一词。我实际要替换的术语列表大约有7000个条目,按其长度从最长到最短的顺序排序(我知道这意味着每个文档/字符串都被处理7000次,不幸的是,我也没有解决方案)。目前,我的脚本使用第一个术语,将其替换为整个字符串,然后使用第二个术语,并从字符串的开头重新开始,直到所有术语都被替换为止。 不幸的是,这会产生一些意想不到的影响:

  1. “发布”一词也替换了标签中的单词。在以下示例中,该示例位于链接内和标记内。
  2. 该脚本还会替换其自身插入的标签,例如我插入了<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})之间进行替换的表达式。 }。

0 个答案:

没有答案