使用python的re.sub()在指定标签之间用<br>替换\ n

时间:2019-07-03 17:57:46

标签: python html regex

我在.tsv文件中有一系列制表符分隔的html代码段。这是其中一个片段的示例:

<li> 
  <p>Create a list of letters, <code>lst</code> from the string <code>strng = &quot;abc&quot;</code>.</p> 

  <ul> 
    <li>Use the list constructor, <code>list()</code>, to create a list from a string.</li> 
  </ul> 

  <pre>
      <code class='language-python' lang='python'>
      strng = &quot;abc&quot; 
      lst = list(a) 
      #lst = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;] 
    </code>
  </pre> 

</li>

我想用\n<br>标签之间的换行符<pre> <code class='language-python' lang='python'> only 替换换行符</code> </pre> ,使用正则表达式和re.sub()

我尝试创建以下正则表达式以匹配所需的换行符:

(?<=<pre><code)\r\n?|\n(?<=</pre></code>)

但是,上述正则表达式与代码段中的任何换行符都不匹配。虽然,如果我删除正向后看,则正则表达式 会匹配我需要的换行符(至少对于我在本文中显示的摘录来说,是a;尽管那不是真的)用于所有输入)。

(?<=<pre><code)\r\n?|\n

正则表达式能否在所有可能的代码片段中捕获<pre> <code class='language-python' lang='python'></code> </pre>标签之间的所有换行符?

编辑:这些代码段不使用“完整” html。实际上,它们应被导出到抽认卡应用程序mnemosyne中。这些片段中的每个片段都代表一个抽认卡,该抽认卡将始终具有相同的受控html结构(由我定义)。因此,在这种情况下使用正则表达式不会有任何后果。另外,mnemosyne使用的html渲染器在<pre>标签内没有换行符,因此我尝试使用<br>手动进行。

2 个答案:

答案 0 :(得分:1)

如果所有文件都是HTML代码段(即可解析的XML),那么最好的方法就是使用XML解析器:

from xml.dom import minidom
xmlDocument = minidom.parse('file.tsv')
codeItem = xmldoc.getElementsByTagName('code')
codeItem.firstChild.replaceWholeText(codeItem.firstChild.nodeValue.replace('\n', '<br>'))
print xmlDocument.toxml()

答案 1 :(得分:1)

如果您对自己的输入足够有信心,可以继续使用正则表达式而不是HTML解析器,那么一种更简单的方法可能是分两步替换,在{ {1}}:

re.sub

(可能想要def nl2br(text): return "<br>".join(text.splitlines()) re.sub("(<pre><code[^>]*>)(.*?)(</code></pre>)", lambda m: m.group(1) + nl2br(m.group(2)) + m.group(3), html, flags=re.DOTALL) / \s*<pre> / <code>之间的</code>。)