【问题标题】:Replacing \n with <br> between specified tags using python's re.sub()使用 python 的 re.sub() 在指定标签之间用 <br> 替换 \n
【发布时间】:2019-07-03 17:57:46
【问题描述】:

我在.tsv 文件中有一系列制表符分隔的 html sn-ps。这是其中一个 sn-ps 的示例:

<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>

我想在&lt;pre&gt; &lt;code class='language-python' lang='python'&gt;&lt;/code&gt; &lt;/pre&gt; 标签之间用换行符&lt;br&gt; 替换换行符\nonly,使用正则表达式和@987654330 @。

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

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

但是,上面的正则表达式不匹配来自 sn-p 的任何换行符。虽然,如果我删除积极的后视,那么正则表达式 确实 匹配我需要的换行符(至少对于我在这篇文章中显示的 sn-p,a;虽然那不会对所有输入都为真)。

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

能否在所有可能的 sn-ps 中捕获标签之间的所有换行符:&lt;pre&gt; &lt;code class='language-python' lang='python'&gt;&lt;/code&gt; &lt;/pre&gt; 的正则表达式?

编辑:这些 sn-ps 不使用“完整”html。它们实际上是要导出到抽认卡应用程序mnemosyne。这些 sn-ps 中的每一个都代表一个抽认卡,它始终具有相同的受控 html 结构(由我定义)。因此,在这种情况下使用正则表达式不会有任何后果。此外,mnemosyne 使用的 html 渲染器不会在&lt;pre&gt; 标签内换行,所以我尝试使用&lt;br&gt; 手动进行。

【问题讨论】:

  • 为什么不使用 xml 解析器?
  • 请不要这样做(用正则表达式解析 HTML)! You'll summon TH̘Ë͖́̉ ͠P̯͍̭O̚​N̐Y̡。用BeautifulSoup之类的解析,修改你关心的元素里面的文字。
  • 所以我要问人们不喜欢的问题:为什么,鉴于&lt;pre&gt; 通常可以完成这项工作?这是否是您真正的问题是摆脱常见缩进的解决方法的一部分?
  • 这些 sn-ps 不使用“完整”html。它们实际上只是要导出到抽认卡应用程序mnemosyne 的文件。这些 sn-ps 中的每一个都代表一个抽认卡,它始终具有相同的受控 html 结构(由我定义。)因此,在这种情况下使用正则表达式不会有任何后果。
  • @David:当然,作为介绍问题的简短句子,它不会有什么坏处:)

标签: python html regex


【解决方案1】:

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

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*介于&lt;pre&gt;/&lt;code&gt;&lt;/code&gt;/&lt;/pre&gt;之间。)

【讨论】:

    【解决方案2】:

    如果所有文件都只是 HTML sn-ps,即可解析的 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多