我会尽量保持这个简短而重要的。
鉴于以下内容
#!/usr/bin/python
from lxml import etree
root = etree.Element('root')
sect = etree.SubElement(root,'sect')
para = etree.SubElement(sect,'para')
para.text = 'this is a [b]long[/b] block of text. Much longer than this example makes it out to be.'
我如何才能将输出转换为下面的输出。注意[b]成为元素<b>
<root>
<sect>
<para>
this is a <b>long</b> block of text.
Much longer than this example makes it out to be.
</para>
</sect>
</root>
我的实际输入和xml要复杂得多。然而,这是它的要点。我已经采用了标准格式的文本文档,我将其转换为xml。该文件的结构是相当静态的。因此,这并不像听起来那么疯狂。我现在把它分成几行。这是相关的,因为当我浏览每一行时,我可以毫不费力地识别<sect>
或<title>
,但通常<para>
会在其行中添加一些额外的格式。在此示例中,需要再次转换[b]
。什么是实现这一目标的最佳方式?
要记住的项目
我的输入文本的作者并不总是一致的。因此,最好是建立一个失败的正则表达式来找到[b] WORD [/ b],或者当作者犯了类似[b [WORD [/ b])的错误时。我目前的想法是匹配[b或b]
我目前正在逐行处理输入文件。我删除了任何空白行。我应该考虑事后处理吗?我没有强大的目标,但觉得这可以包含在文本的单个循环中。
当我输出文档时,这需要与lxml一起使用。例如,请参阅下面的编辑,我对bbc解析器的评论
我下午大部分时间都在做这个,并且可以讨论我采取的更多路线。我将在整个晚上进行这项工作,所以如果我遇到其他项目,请记住,我会相应地更新这个问题。
编辑: 或我的bbc解析器问题
保罗若有所思地建议postmarkup-1.1.4,但是你可以看到它与lxml不相符。将元素转换为元素。这是我今天下午遇到的一个问题,当时我通过搜索和替换来做到这一点。最终,这是一个完美的sed解决方案。正如所指出的那样。但是,我希望不是这个脚本的最终用户,而是宁愿在一个命令中包含所有内容。
>>> p.text = render_bbcode(p.text)
>>> p.text
'this is a <strong>long</strong> text string'
>>> etree.tostring(root)
'<root><p>this is a <strong>long</strong> text string</p></root>'
反向执行此操作会返回同样糟糕的结果
>>> p.text
'this is a [b]long[/b] text string
>>> render_bbcode(etree.tostring(root))
u'<root><p>this is a <strong>long</strong> string</p></root>'
答案 0 :(得分:2)
postmarkup库似乎最接近您想要做的。
http://pypi.python.org/pypi/postmarkup/1.1.4
不幸的是,它最近没有看到很多开发,但我没有看到任何其他库看起来更好。
从那里开始并修改现有元素以适合您的语法可能比从头重新创建解析轮更快。
如果这不是一个好的方向,你可能会看到更低级的语法lexing和parsing,但是这会很快变得复杂到你可能更好的简单重复正则表达式和手动校正。你的语料库有多大?
最后一点需要注意的是,像这样的任务正是sed
编写的内容。如果您愿意学习如何使用它,它可能会非常强大。如果你还不熟悉它,那么Python可能会更容易。