【问题标题】: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)
但这不会像我想要的那样工作。我希望在期待之前用<p> 替换任何东西,在期待之后用</p> 替换任何东西
这可能吗?
【问题讨论】:
-
-
-
-
表现得好像我没有给你regex solution :P <br\s*/?>(.*?)(?=<br\s*/?>|$),替换为<p>\1</p>
标签:
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 解析器的人,比如beautifulsoup:
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>"