我有以下一行文字:
<code>stuff</code> and stuff and $\LaTeX$ and <pre class="mermaid">stuff</pre>
使用Python,我想打破标记实体以获得以下列表:
['<code>', 'stuff', '</code>', ' and stuff and $\\LaTeX$ ', '<pre class="mermaid">', 'stuff', '</pre>']
到目前为止,我使用了:
markup = re.compile(r"(<(?P<tag>[a-z]+).*>)(.*?)(<\/(?P=tag)>)")
text = '<code>stuff</code> and stuff and $\LaTeX$ and <pre class="mermaid">stuff</pre>'
words = re.split(markup, text)
但它产生:
['<code>', 'code', 'stuff', '</code>', ' and stuff and $\\LaTeX$ ', '<pre class="mermaid">', 'pre', 'stuff', '</pre>']
问题是(?P=tag)
组被添加到列表中,因为它被捕获了。我捕捉它只是为了得到最接近的结束标签。
假设代码一次只处理一行,我如何在结果列表中去掉它?
3条答案
按热度按时间qyzbxkaa1#
您可以使用
xml
,它是为xml files
设计的模块,与html
同义。a11xaf1n2#
RegEx不适合解析HTML。然而,它通常足以用于令牌化。使用
re.finditer
,令牌化变成了一行代码:说明:
(?:...)
;我们这里不需要具体的捕获。<(?:.*?>)?
(可能是无效的(只是<
符号),仅通过其开口<
识别,直到>
)或明文[^<]+
。这将处理您的测试用例
正确地,生产
然而,请注意,一个成熟的HTML标记器需要一个更复杂的常规语法来处理,例如。
onclick = "console.log(1 < 2)"
等属性。最好使用现成的库来为您进行标记解析(甚至只是标记化)。von4xj4u3#
输出:
['<code>', 'stuff', '</code>', ' and stuff and $\\LaTeX$ and ', '<pre class="mermaid">', 'stuff', '</pre>']