【发布时间】:2011-06-21 23:51:35
【问题描述】:
我会尽量保持简明扼要。
鉴于以下
#!/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 or 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>'
【问题讨论】:
-
注意,我的另一个问题仍然有效。 stackoverflow.com/questions/6417881/…我还没有在我们的开发服务器上成功安装lxml,我正在本地机器上编码。
-
您可能会尝试搜索 \[(.+?)\],然后找到匹配的 \[\1\] 结束标签,但您可能还需要考虑嵌套标签,取决于文本的复杂程度。
-
此级别不会有嵌套标签。标签内应始终有一个字母,标签周围只有一两个单词。去年手工做了几百次之后,我观察到的最大作者错误是 [b[some word[b].括号方向错误和/或未正确闭合。
-
如果您实际上是在解析 BBCode,您是否检查了现有的解析器以确保它们没有做您想做的事情?
-
没有。出于某种原因,我没有想到。多么简单的建议,我怎么没想到呢?在我开始搜索 Ernst 之前,您能推荐一个吗?
标签: python xml regex lxml text-processing