问题描述
|
我会尽量保持简短。
鉴于以下
#!/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>
的行中会有一些额外的格式。在此示例中,需要再次转换“ 6”。做到这一点的最佳方法是什么?
注意事项
我输入文本的作者并不总是一致的。因此,最好开发一个lost正则表达式来查找[b] WORD [/ b],或者当作者错误输入诸如[b [WORD [/ b]]之类的东西时。我目前的想法是匹配[b或b]
我目前正在逐行处理输入文件。我删除了所有空白行。我应该考虑事后处理吗?我没有很强的目标,但是觉得可以将其包含在整个文本的单个循环中。
当我输出文档时,这将需要与lxml配合使用。例如,请参阅下面的编辑以及我对bbc解析器的评论
我在整个下午的大部分时间里都在工作,可以讨论我走的更多路线。我将在整个晚上进行此工作,因此如果我想起其他事项,请相应地更新此问题。
编辑:还是我的BBC解析器问题
Paul深思熟虑地建议使用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>\'
解决方法
postmarkup库似乎最接近您想要做的事情。
http://pypi.python.org/pypi/postmarkup/1.1.4
不幸的是,它最近没有看到很多开发,但是我看不到其他任何看起来更好的库。
从那里开始并修改现有元素以适合您的语法可能比从头重新发明解析轮要快。
如果这不是一个好的方向,您可能会考虑使用更底层的语法词法分析,但这将很快变得复杂,以至于您可以通过简单的重复正则表达式和手工校正来更好。您的语料库有多大?
最后要注意的是,这样的任务正是ѭ9编写的。如果您愿意学习如何使用它,它的功能可能会非常强大。如果您还不满意,那么Python可能会更容易。