除了使用正则表达式提取信息,有时候还需要借助它来修改文本。例如,想要把一串文本中的所有数字都去掉,如果只用字符串的replace方法,未免太烦琐了,这时可以借助sub方法。
import re
content = '54aK54yr5oiR54ix5L2g'
content = re.sub('\d+', '', content)
print(content)
运行结果如下:
aKyroiRixLg
这里往 sub 方法的第一个参数中传入 \d+ 以匹配所有的数字,往第二个参数中传人把数字替换成的字符串(如果去掉该参数,可以赋值为空),第三个参数是原字符串。
在上面的 HTML 文本中,如果想获取所有li节点的歌名,直接用正则表达式来提取可能比较烦琐。例如,写成这样:
results = re.findall('<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?\s*?</li>', html, re.S)
for result in results:
print(result[1])
运行结果如下:
一路上有你
往事随风
光辉岁月
记事本
但愿人长久
而此时借助 sub 方法就比较简单了。可以先用 sub 方法将a节点去掉,只留下文本,然后再利用findall提取就好了:
html = re.sub('<a.*?>|</a>', '', html)
print(html)
results = re.findall('<li.*?>(.*?)</li>', html, re.S)
for result in results:
print(result.strip())
运行结果如下:
<div id="songs-list">
<h2 class="title">经典老歌</h2>
<p class="introduction">
经典老歌列表
</p>
<ul id="list" class="list-group">
<li data-view="2">一路上有你</li>
<li data-view="7">
沧海一声笑
</li>
<li data-view="4" class="active">
往事随风
</li>
<li data-view="6"> 光辉岁月</li>
<li data-view="5">记事本
</li>
<li data-view="5">但愿人长久
</li>
</ul>
</div>
一路上有你
沧海一声笑
往事随风
光辉岁月
记事本
但愿人长久
可以看到,经过 sub 方法处理后,a节点就没有了,然后通过 findall 方法直接提取即可。可以发现,在适当的时候借助 sub 方法,可以起到事半功倍的效果。