【问题标题】:Python find and replace questions in xml filesPython 查找和替换 xml 文件中的问题
【发布时间】:2016-03-17 07:23:41
【问题描述】:

我想通过添加特殊元素 <question> 来修改几个 xml 文件(语言语料库),以便能够更轻松地对表示问题的字符串进行操作。

这是我拥有的 xml 文件的示例:

<Turn speaker="spk2" startTime="4836.047" endTime="4840.004">
<Sync time="4836.047"/>
some text
<Sync time="4837.199"/>
first question ?
</Turn>
<Turn speaker="spk1" startTime="4840.004" endTime="4840.768">
<Sync time="4840.004"/>
text
<Event desc="rire" type="noise" extent="instantaneous"/>
</Turn>
<Turn speaker="spk2" startTime="4840.768" endTime="4846.534">
second question ?
<Sync time="4840.768"/>
third question? fourth question ? text
</Turn>

而我想要的结果:

<Turn speaker="spk2" startTime="4836.047" endTime="4840.004"><question>
<Sync time="4836.047"/>
some text
<Sync time="4837.199"/>
first question ?</question>
</Turn>
<Turn speaker="spk1" startTime="4840.004" endTime="4840.768">
<Sync time="4840.004"/>
text
<Event desc="rire" type="noise" extent="instantaneous"/>
</Turn>
<Turn speaker="spk2" startTime="4840.768" endTime="4846.534"><question>
second question ?</question><question>
<Sync time="4840.768"/>
third question?</question><question> fourth question ?</question> text
</Turn>

基本上,它必须将每个问号替换为?&lt;/question&gt;,然后在文本中查找或者另一个?&lt;/question&gt; 一个元素@987654326 @,然后在此处添加开头&lt;question&gt;

第一个元素也将包含字符串“some text”,但这是我想要的,因为无论如何我都无法找到问题的开头。

我真的更喜欢用 python 来做这件事,因为之后我将不得不使用 lxml 库。而且我还想保留原始文件中换行符的数量。

我尝试使用正则表达式来做到这一点,但这似乎有点复杂,因为除了有几个组之外,我还必须考虑换行和重叠。我想出了以下正则表达式,但它捕获了太多:

(</question>|<Turn.*>)([\s\S]*</question>)

我还尝试了一些在字符串上使用 for 循环的方法,但对于 python 和编程来说,我一般来说是新手,但我无法实现我想要的。

【问题讨论】:

  • 您是否需要考虑其他标点符号,例如句号或感叹号,或者您是否总是希望问题从一个回合的开头开始?
  • 不,我只需要找到前面的问号(实际上是结束元素&lt;/question&gt;,因为它很容易将“?”替换为?&lt;/question&gt;)或&lt;Turn&gt;元素的末尾如果它介入到问题之间。理想情况下,我还必须在问题元素中添加一个标签,指示问题开始的文件的行号(类似于&lt;question line="48"&gt;,我想以后很容易添加)

标签: python xml replace


【解决方案1】:
import re

# Using re.split with grouping parens so the separators get returned in the split results
chunk = re.split(r'(<Turn.*?>|\?)', original_text)

# The "<Turn...>" and "?" separators are at the odd indexes. These are the
# places that '<question>' and '</question>' need to be inserted.
for i in range(1, len(chunk), 2):
    if chunk[i] == '?':
        chunk[i-2] += '<question>'
        chunk[i] += '</question>'

new_text = ''.join(chunk)

print(new_text)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-17
    • 2021-11-06
    • 2019-10-16
    • 2017-08-07
    • 1970-01-01
    • 2016-03-27
    • 2019-07-30
    • 2013-07-27
    相关资源
    最近更新 更多