【问题标题】:Regex replace before and after text, keep text in place正则表达式替换文本前后,保持文本原位
【发布时间】:2013-11-04 16:13:08
【问题描述】:

我有一些类似的文字

<br />
blah
<br />
blah blah

我想改成哪个:

<p>
blah
</p>
<p>
blah blah
</p>

我有以下正则表达式

newContent = re.sub("<br />(?=(.*(<br />)?\n)<br />)","<p>",newContent)

但这不会像我想要的那样工作。我希望在期待之前用&lt;p&gt; 替换任何东西,在期待之后用&lt;/p&gt; 替换任何东西

这可能吗?

【问题讨论】:

标签: python html regex replace


【解决方案1】:

是简单的正则表达式,不需要拆分和BeautifulSoup。

import re
t = '(.+)(blah)(.+)(blah blah)'
r = r"""<p>
\2
</p>
<p>
\4
</p>
"""
s = """<br />
blah
<br />
blah blah
"""
print(re.sub(t, r, s, flags=re.S))

它给了

<p>
blah
</p>
<p>
blah blah
</p>

【讨论】:

    【解决方案2】:

    听听那些建议你使用html 解析器的人,比如

    from bs4 import BeautifulSoup
    
    soup = BeautifulSoup(open('htmlfile', 'r'), 'html')
    
    for br in soup.find_all('br'):
        p = soup.new_tag('p')
        p.string = br.next_sibling.extract()
        br.replace_with(p)
    
    print(soup.prettify())
    

    像这样运行它:

    python3 script.py
    

    产生:

    <html>
     <body>
      <p>
       blah
      </p>
      <p>
       blah blah
      </p>
     </body>
    </html>
    

    【讨论】:

      【解决方案3】:

      您不能使用正则表达式来做到这一点,因为它们只能替换原处的文本片段,而不是进一步传播结果。你所能做的只是一些像这样的解决方法:

       s = "html code"
       s = s.split("<br />");
       s = "<p>" + "</p><p>".join(s) + "</p>"
      

      【讨论】:

        猜你喜欢
        • 2014-03-11
        • 2017-10-18
        • 2017-01-21
        • 2019-11-29
        • 2021-10-11
        • 2011-09-05
        • 2014-05-12
        相关资源
        最近更新 更多