1.引入
开源中国: https://tool.oschina.net/regex
正则表达式实现的字符串的检索,替换,匹配匹配验证。
2.match()
match()方法尝试从字符串的起始位置匹配正则表达式,匹配成功就返回结果,不成功返回None
match()方法第一个参数传入正则表达式,第二个表示要匹配的字符串
import re
content='Hello 123 456 World_This is a Regix Demo'
print(len(content))
result=re.match('^Hello\s\d\d\d\s\d{3}\s\w{10}',content)
print(result)
print(result.group())#group()输出匹配的内容
print(result.span())#span()输出匹配的范围
'''
^Hello表示以Hello开头
\s表示匹配空白字符
\d表示匹配数字,\s匹配空白字符
\d{3}表示前面的规则匹配三次等价于\d\d\d
\w{10}表示匹配10个字母,数字或者下划线
'''
匹配目标
import re content='Hello 123456 World_This is a Regix Demo' result=re.match('^Hello\s(\d+)\sWorld',content) print(result) print(result.group()) print(result.group(1)) print(result.span())
通用匹配
.*:
.表示匹配任意字符,
*表示匹配前面的字符无限次
import re content='Hello 123456 World_This is a Regix Demo' result=re.match('^Hello\s(\d+)\sWorld',content) print(result) print(result.group()) print(result.group(1)) print(result.span())
贪婪与非贪婪
import re content='Hello 1234567 World_This is a Regix Demo' result=re.match('^He.*(\d+).*Demo',content) print(result.group()) print(result.group(1))
输出:
Hello 1234567 World_This is a Regix Demo
7具体匹配过程:开头先匹配He,然后.*继续匹配,直到碰到数字1,因为此时为贪婪模式,. *会匹配尽可能多的字符,此正则表达式. *后是\d+,也就是最少一个数字,并没有指定多少个数字,于是. *尽可能匹配多的数字,匹配到了123456,给\d+留下的就是7了,所以只得到了7
import re content='Hello 1234567 World_This is a Regix Demo' result=re.match('^He.*?(\d+).*Demo',content) print(result.group()) print(result.group(1))
输出:
Hello 1234567 World_This is a Regix Demo
1234567这里只在.*后加了?,就变为了非贪婪匹配,非贪婪匹配在匹配时会进可能匹配少的字符,当. *?匹配到Hello后的空格时,在往后就是数字,而\d+正好可以匹配,那么. *?不在进行匹配,而是交给\d+去匹配,\d+匹配的结果就是1234567。
注意:
匹配时,字符串中间尽量使用非贪婪匹配,就是. *?代替. *
当. *?放在最后时,可能匹配不到任何内容
import re content ='https://www/baidu.com/comment/wd' result1=re.match('^ht.*?comment/(.*?)',content) result2=re.match('^ht.*?comment/(.*)',content) print(result1.group()) print('reslult1',result1.group(1)) print('reslult2',result2.group(1))
输出:
https://www/baidu.com/comment/
reslult1
reslult2 wd修饰符
import re content='''Hello 123456 World_This is a Regix Demo ''' result=re.match('^He.*?(\d+).*Demo',content,re.S)#若没有re.S,.就无法匹配换行符,程序报错 print(result.group()) print(result.group(1))
修饰符:
re.I——–使匹配对大小写不敏感
re.S——–使.匹配包括换行符在内的所有字符
转义匹配
.可以匹配换行符以外的字符,但是目标字符串中包含.就需要转义
import re content='(百度)www.baidu.com' result=re.match('\(百度\)www\.baidu\.com',content) print(result.group())
3.search()
match()方法是从字符串的开头匹配,一旦开头不匹配,整个匹配失败
import re
content='No Hello 123456 World_This is a Regix Demo'
result=re.match('He.*?(\d+).*Demo',content,re.S)
print(result)
输出:None
search()方法在匹配时会扫描整个字符串,然后返回第一个成功匹配的结果。也就是说,正则表达式可以是字符串的一部分。
import re
content='No Hello 123456 World_This is a Regix Demo'
result=re.search('He.*?(\d+).*Demo',content,re.S)
print(result)
实例:
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>
'''
res=re.search('<li.*?active.*?singer="(.*?)">(.*?)</a>',html,re.S)
#print(res.group())
print(res.group(1),res.group(2))
#输出
#齐秦 往事随风
4.findall()
search()方法,它返回匹配表达式的第一个内容。 findall()方法会搜索整个字符串,返回匹配正则表达式的所有内容。
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.*?singer="(.*?)">(.*?)</a>',html,re.S)#如果有返回结果,就是列表类型
# print(results)
# print(type(results))
for result in results:
print(result)
print(result[0],result[1])
5.sub()
借助正则表达式来修改文本。例如,把一串文本中的所有数字去掉。
import re
content='45a4fsfafa545g46afds2fa13fafsaf'
content=re.sub('\d+','',content)#\d+来匹配所有数字,第二个参数为替换成的字符串,第三个为原字符串
print(content)
借助sub提取歌曲名
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>
'''
html=re.sub('<a.*?>|</a>','',html)
print(html)
htmls=re.findall('<li.*?>(.*?)</li>',html,re.S)
print(htmls)
for res in htmls:
print(res.strip())#移除开头或者结尾指定的字符,默认为空格或者换行符
6.compile()
此方法可以将正则字符串编译成正则表达式对象,以便在后面的匹配中复用。
import re
content1='2019-11-25 12:00'
content2='2019-11-20 11:00'
content3='2019-11-15 14:00'
pattern=re.compile('\d{2}:\d{2}')
res1=re.sub(pattern,'',content1)
res2=re.sub(pattern,'',content2)
res3=re.sub(pattern,'',content3)
print(res1,res2,res3)