正则表达式替换文本之前和之后,保持文本到位

时间:2013-10-25 13:46:40

标签: python html regex replace

我有一些像

这样的文字
<br />
blah
<br />
blah blah

我试图改为:

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

我有以下正则表达式

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

但这并不是我想要的。在期待被<p>替换之前我想要任何事情,并且期待被</p>替换

这可能吗?

3 个答案:

答案 0 :(得分:3)

倾听那些建议您使用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>

答案 1 :(得分:1)

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

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

答案 2 :(得分: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>