【发布时间】: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>
基本上,它必须将每个问号替换为?</question>,然后在文本中查找或者另一个?</question> 或一个元素@987654326 @,然后在此处添加开头<question>。
第一个元素也将包含字符串“some text”,但这是我想要的,因为无论如何我都无法找到问题的开头。
我真的更喜欢用 python 来做这件事,因为之后我将不得不使用 lxml 库。而且我还想保留原始文件中换行符的数量。
我尝试使用正则表达式来做到这一点,但这似乎有点复杂,因为除了有几个组之外,我还必须考虑换行和重叠。我想出了以下正则表达式,但它捕获了太多:
(</question>|<Turn.*>)([\s\S]*</question>)
我还尝试了一些在字符串上使用 for 循环的方法,但对于 python 和编程来说,我一般来说是新手,但我无法实现我想要的。
【问题讨论】:
-
您是否需要考虑其他标点符号,例如句号或感叹号,或者您是否总是希望问题从一个回合的开头开始?
-
不,我只需要找到前面的问号(实际上是结束元素
</question>,因为它很容易将“?”替换为?</question>)或<Turn>元素的末尾如果它介入到问题之间。理想情况下,我还必须在问题元素中添加一个标签,指示问题开始的文件的行号(类似于<question line="48">,我想以后很容易添加)