一.re.match
re.match(patern,string,flags=0)
re.match函数尝试从字符串的开头开始匹配一个模式,如果匹配成功,返回一个匹配成功的对象,否则返回None。
1.常规的匹配
import re
content = 'Hello 3232 4324 World_This is a Regex Demo'
print(len(content))
result = re.match('^Hellosd{4}sd{4}sw{10}.*mo$',content)
print(result)
print(result.group())# .group()不带参数,输出匹配的整个参数。
print(result.span())# .span()输出匹配的范围。
'''
输出
42
<re.Match object; span=(0, 42), match='Hello 3232 4324 World_This is a Regex Demo'>
Hello 3232 4324 World_This is a Regex Demo
(0, 42)
'''
注释
group()用法
2.泛匹配
用.*
表示任意字符
import re
content = 'Hello 3232 4324 World_This is a Regex Demo'
result = re.match('^Hello.*mo$',content)
print(result)
print(result.group())
print(result.span())
'''
输出
<re.Match object; span=(0, 42), match='Hello 3232 4324 World_This is a Regex Demo'>
Hello 3232 4324 World_This is a Regex Demo
(0, 42)
'''
3.匹配目标(分组)
一般我们把匹配目标用小括号括起来,然后指定左右端点,就可以匹配到想要的字符。
import re
content = 'Hello 3232 4324 World_This is a Regex Demo'
result = re.match('^Hellos(d{4})s(d+)s.*mo$',content)
print(result)
print(result.group(1))#第一个小括号括起来匹配的内容
print(result.group(2))#第二个小括号括起来的内容
print(result.span())
'''
<re.Match object; span=(0, 42), match='Hello 3232 4324 World_This is a Regex Demo'>
3232
4324
(0, 42)
'''
4.贪婪匹配
import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*(d+).*mo$',content)
print(result)
print(result.group(1))
print(result.span())
'''
输出
<re.Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'>
7
(0, 40)
'''
因为.*
表示任意字符,默认贪婪模式会匹配尽量多的任意字符,而d+
至少要匹配一个数字,所以前面的.*
一直匹配到最后一个数字之前。
5.非贪婪模式
import re
content = 'Hello 1234567 World_This is a Regex Demo'
result = re.match('^He.*?(d+).*mo$',content)
print(result)
print(result.group(1))
print(result.span())
'''
输出
<re.Match object; span=(0, 40), match='Hello 1234567 World_This is a Regex Demo'>
1234567
(0, 40)
'''
.*?
是非贪婪模式,匹配尽可能少字符。
6.匹配换行符
import re
content = "Hello 123456 World_This
is a Regex Demo"
result = re.match('^He.*?(d+).*mo$',content)
print(result)
"""
输出None
"""
原因是.
不能匹配换行符,添加re.S
后才能匹配换行符。
import re
content = "Hello 1234567 World_This
is a Regex Demo"
result = re.match('^He.*?(d+).*mo$',content,re.S)
print(result)
print(result.group(1))
"""
<re.Match object; span=(0, 41), match='Hello 1234567 World_This
is a Regex Demo'>
1234567
"""
7.转义
正则表达式中的许多特殊字符如果不做转义就无法被当成普通字符匹配到,会被认为是关键字使用,比如*.[ ]等。
import re
content = 'price $50.09'
result = re.match('price $50.09',content) #字符串中有特殊字符$和.
print(result)
'''
结果返回none,没匹配到。
'''
利用反斜杠进行转义,转义之后才能匹配
import re
content = 'price $50.09'
result = re.match('price $50.09',content)
print(result
'''
<re.Match object; span=(0, 12), match='price $50.09'>
'''
总结
尽量使用泛匹配模式,使用括号得到匹配目标,尽量使用非贪婪模式,使用re.S,因为HTML中有大量的换行符,这样就能匹配任意字符了。
二.re.search
re.search会搜索整个字符串,并返回第一个成功的匹配的字符串。
import re
content = "jlljjljh Hello 1234 World_This is a Regex Demo,Don't forget!$"
result = re.match('Hello.*?(d+).*?',content)
print(result) #用match的话,匹配不到开头,返回None
print("==========================")
result = re.search('Hello.*?(d+).*?',content)
print(result)
print(result.group(1))
'''
None
==========================
<re.Match object; span=(9, 19), match='Hello 1234'>
1234
'''
小练习
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="邓丽君"><i class="fa fa-user"></i>但愿人长久</a>
</li>
</ul>
</div>'''
#匹配齐秦,往事随风
result1 = re.search('<li.*?active.*?singer="(.*?)">(.*?)</a>',html,re.S)
if result1:
print(result1.group(1), result1.group(2))
#匹配 任贤齐 沧海一声笑
result2 = re.search('<li.*?singer="(.*?)">(.*?)</a>',html,re.S)
if result2:
print(result2.group(1),result2.group(2))
#匹配一路上有你
result3 = re.search('<li.*?>(.*)</li>',html)
print(result3.group(1))
总结,为了方便能用search方法,就用search方法,尽量使用re.S,用非贪婪模式
三.re.findall
搜索字符串,以列表形式返回全部能匹配的字符,包括空匹配值。如果模式包含分组,将返回与分组匹配的文本列表。如果使用了不只一个分组,那么列表中的每项都是一个元组,包含每个分组的文本。
demo1
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>'''
results = re.findall('<a.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>',html,re.S)
print(results)
# 拆包思想
for a,b,c,in results:
print(a,b,c)
'''
输出
[('2.mp3', '任贤齐', '沧海一声笑'), ('3.mp3', '齐秦', '往事随风'), ('4.mp3', 'beyond', '光辉岁月'), ('5.mp3', '陈慧琳', '记事本'), ('6.mp3', '邓丽君', '但愿人长久')]
2.mp3 任贤齐 沧海一声笑
3.mp3 齐秦 往事随风
4.mp3 beyond 光辉岁月
5.mp3 陈慧琳 记事本
6.mp3 邓丽君 但愿人长久
'''
注:
demo2
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>'''
#匹配所有的歌名
results = re.findall('<li.*?s*?(<a.*?>)?(w+)(</a>)?s*?</li>',html,re.S)
print(results)
for i in results:
print(i[1])
'''
输出
[('', '一路上有你', ''), ('<a href="2.mp3" singer="任贤齐">', '沧海一声笑', '</a>'), ('<a href="3.mp3" singer="齐秦">', '往事随风', '</a>'), ('<a href="4.mp3" singer="beyond">', '光辉岁月', '</a>'), ('<a href="5.mp3" singer="陈慧琳">', '记事本', '</a>'), ('<a href="6.mp3" singer="邓丽君">', '但愿人长久', '</a>')]
一路上有你
沧海一声笑
往事随风
光辉岁月
记事本
但愿人长久
'''
四.re.sub
替换字符串中每一个匹配的子串后返回替换后的字符串。
demo1
import re
content = 'Hello 3232 4324 World_This is a Regex Demo'
content = re.sub('d+','',content)#把数字替换为空
print(content)
'''
输出
Hello World_This is a Regex Demo
'''
demo2
import re
content = 'Hello 3232 4324 World_This is a Regex Demo'
content = re.sub('d+','Replacement',content)#数字部分都替换成‘replacement’
print(content)
# 输出 Hello Replacement Replacement World_This is a Regex Demo
五re.compile
将正则字符串编译成正则表达式对象,便于复用该匹配模式
import re
content = 'Hello 3232 4324 World_This is a Regex Demo'
a = re.compile('^He.*?(d+).*mo$',re.S)#编译正则表达式对象。
result = re.match(a,content)
print(result.group(1))
# 输出 3232