根据特殊规范将 1st|2nd|3rd|4th 的句子转换为 XML



我想把这些句子变成xml。

I will meet you at 1st.
5th... OK, 5th?
today is 2ndn
Aug.3rd

喜欢这个:

<Text VAlign="top" VPosition="85.00">
    I will meet you at 1<Font Script="super">st</Font>.
</Text>
<Text VAlign="top" VPosition="85.00">
    5<Font Script="super">th</Font>... OK, 5<Font Script="super">th</Font>
</Text>
<Text VAlign="top" VPosition="85.00">
        today is 2<Font Script="super">nd</Font>n
</Text>
<Text VAlign="top" VPosition="85.00">
        Aug.3<Font Script="super">rd</Font>n
</Text>

我正在使用minidom,但是经过许多帖子和答案,我不介意使用其他解析器重写我的代码。一开始,我认为这很容易,只需将st|nd|rd|th替换为

<Font Script="super">st|nd|rd|th</Font>,然后用这个新字符串创建文本节点()。

但是,该符号<, > and "结果是通过writexml()方法&lt; &gt; and $quot;的。 它适用于XML规范,但不适合读取。

我该怎么做?非常感谢。

以下是你可以使用标准库中的xml.etree.ElementTree做什么:

import re
import xml.etree.ElementTree as ET

data = """I will meet you at 1st.
5th... OK, 5th?
today is 2nd
Aug.3rd"""
endings = ['st', 'th', 'nd', 'rd']
pattern = re.compile('(%s)' % "|".join(endings))
root = ET.Element('root')
for line in data.split('n'):
    items = []
    for item in re.split(pattern, line):
        if item in endings:
            items.append('<Font Script="super">%s</Font>' % item)
        else:
            items.append(item)
    element = ET.fromstring("""<Text VAlign="top" VPosition="85.00">%s</Text>""" % ''.join(items))
    root.append(element)
print ET.tostring(root)

它生成以下 xml:

<root>
    <Text VAlign="top" VPosition="85.00">I will meet you at 1<Font Script="super">st</Font>.
    </Text>
    <Text VAlign="top" VPosition="85.00">5<Font Script="super">th</Font>... OK, 5<Font Script="super">th</Font>?
    </Text>
    <Text VAlign="top" VPosition="85.00">today is 2
        <Font Script="super">nd</Font>
    </Text>
    <Text VAlign="top" VPosition="85.00">Aug.3
        <Font Script="super">rd</Font>
    </Text>
</root>

为了使输出带有推进缩进和换行符,我需要 lxml,我把它放在 alecxe 的代码中。

from lxml import etree as ET
print ET.tostring(root, pretty_print=True)

相关内容

最新更新