re.sub
替换字符串中每一个匹配的字串后返回替换后的字符串
该方法主要用的三个参数,第一个参数是匹配模式即正则表达式,也是你要替换的原字符串部分。第二个参数是你需要替换成的字符串。第三个参数是原字符串。
re.sub(pattern, repl, string, count=0, flags=0)
- 匹配演练
实战的效果是最好的,直接练习
练习1:
要求:把1234567用空字符替换掉,也就是相等于把字符串中的1234567删除掉。
import re
content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
content = re.sub('\d+','',content)
print(content)
结果:
Extra stings Hello World_This is a Regex Demo Extra stings
练习2:
要求:把1234567替换成Replacement
import re
content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
content = re.sub('\d+','Replacement',content)
print(content)
结果:
Extra stings Hello Replacement World_This is a Regex Demo Extra stings
练习3:
要求:把1234567替换成1234567 8910。(如果我们要替换的是原字符串本身或者包换原字符串)
import re
#1.把匹配的正则表达式加一个括号
#2.\1是表示拿到匹配内容,就是把(\d+)的内容拿到手了和 8910组合成新的内容
#3.但是反斜杠会转义,我们需要原生字符,前面加r。
content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'
content = re.sub('(\d+)',r'\1 8910',content)
print(content)
结果:
Extra stings Hello 1234567 8910 World_This is a Regex Demo Extra stings
练习4:
import re
html='''<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">
<a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
</li>
<li data-view="4" class="active">
<a href="/3.mp3" singer="齐秦">往事随风</a>
</li>
<li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
<li data-view="5"><a href="/5.mp3" singer="陈惠琳">记事本</a></li>
<li data-view="5">
<a href="/6.mp3" singer="邓丽君">但愿人长久</a>
</li>
</ul>
</div>
'''
要求:把所有歌名匹配出来。要用到re.sub内容。因为上一篇我们用re.findall匹配出了所有歌名。当时直接用re.findall写的有些复杂,这次我们练习用re.sub简化下,再re.findall
思路:用re.sub把标签替换掉,我们只取所有歌名,标签不需要
html = re.sub('<a.*?>|</a>','',html)
print(html)
results = re.findall('<li.*?>(.*?)</li>',html,re.S)
print(results)
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>
['一路上有你', '\n 沧海一声笑\n ', '\n 往事随风\n ', '光辉岁月', '记事本', '\n 但愿人长久\n ']
一路上有你
沧海一声笑
往事随风
光辉岁月
记事本
但愿人长久
可以看到匹配出来的内容有的有换行符,有的没有,那是因为在li标签中,有的内容有换行符,有的内容没有…,所有我们取内容,strip()下就ok了。re.sub方法就介绍到这里。