正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。
大家在写正则表达式的过程中,可利用开源中国的正则表达式测试工具,对其进行检测,链接为:http://tool.oschina.net/regex/
常见的正则表达式匹配模式如下所示:
re.match尝试从字符串的起始位置匹配的一个模式,如果不是起始位置匹配的话,match()就返回none
基本的语法结构:re.match(pattern,string,flags=0)
最常规的匹配
#_*_coding: utf-8_*_
import re
content="Hello 123 456 word_This is a Regex Demo"
result=re.match("^Hello\s\d+\s\d+\s\w+.*Demo$",content)
print(result)
print(result.group())
print(result.span())
泛匹配
import re
content="hello 123 4567 world_this is a Regex Demo"
result=re.match("^hello.*Demo$",content)
print(result)
print(result.group())
print(result.span())
匹配目标
import re
content="hello 123 4567 world_this is a Regex Demo"
result=re.match("^hello\s(\d+).*Demo$",content)
print(result)
print(result.group())
print(result.group(1))
print(result.span())
贪婪匹配
import re
content="hello 123 4567 world_this is a Regex Demo"
result=re.match("^h.*(\d+).*Demo$",content)
print(result)
print(result.group(1))
非贪婪匹配
import re
content="hello 123 4567 world_this is a Regex Demo"
result=re.match("^h.*?(\d+).*?Demo$",content)
print(result)
print(result.group(1))
指定匹配模式,.*可匹配换行符
import re
content='''hello 123 4567 world_this
is a Regex Demo'''
result=re.match("^h.*?(\d+).*?Demo$",content,re.S)
print(result)
print(result.group(1))
转义字符
import re
content="the price is $5.00"
result=re.match("the price is \$5\.00",content)
print(result)
总结:尽量使用泛匹配,使用括号获取到匹配目标,尽量使用非贪婪模式,有换行符就用re.S
re.search,扫描整个字符串,并返回第一个成功的匹配
总结:为匹配方便,能用search,就不用match
import re
content='''Extra string hello 123 4567 world_this
is a Regex Demo Extra string'''
result=re.search("h.*?(\d+).*?Demo",content,re.S)
print(result)
print(result.group(1))
匹配实例:
#_*_coding: utf-8_*_
import re
html='''<div id="songs-list>
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="/3.mp3" singer="邓丽君"><i class="fa fa-user">i>但愿人长久a>
li>
ul>
<div>'''
result=re.search('<li.*?active.*?singer="(.*?)">(.*?)a>',html,re.S)
if result:
print(result.group(1),result.group(2))
搜索字符串,以列表形式返回所有匹配结果
#_*_coding: utf-8_*_
import re
html='''<div id="songs-list>
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="/3.mp3" singer="邓丽君"><i class="fa fa-user">i>但愿人长久a>
li>
ul>
<div>'''
results=re.findall('<li.*?singer="(.*?)">(.*?)a>',html,re.S)
if results:
for result in results:
print(result)
替换字符串中每一个匹配的子串返回替换后的字符
#_*_coding: utf-8_*_
import re
content="Extra strings Hello 1234567 World_This is a Regex Demo Extra strings"
content=re.sub('\d+','',content)
print(content)
如果替换的字符串包含元字符串本身,可采用下面的方法:
#_*_coding: utf-8_*_
import re
content="Extra strings Hello 1234567 World_This is a Regex Demo Extra strings"
content=re.sub('(\d+)',r'\1 8910',content)
print(content)
实例:去除HTML代码中的a标签,并获取歌名
#_*_coding: utf-8_*_
import re
html='''<div id="songs-list>
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="/3.mp3" singer="邓丽君"><i class="fa fa-user">i>但愿人长久a>
li>
ul>
<div>'''
html=re.sub('<a.*?>|a>','',html)
html=re.sub('<i.*?>i>','',html)
print(html)
results=re.findall('<li.*?>(.*?)li>',html,re.S)
print("------------------------------------")
for result in results:
print(result.strip())
将正则表达式字符串编译成正则表达式对象
#_*_coding: utf-8_*_
import re
content='''Hello 1234567 World_This
is a Regex Demo
'''
pattern=re.compile('Hello.*?Demo',re.S)
result=re.match(pattern,content)
print(result)
#_*_coding: utf-8_*_
import re
import requests
content=requests.get("https://book.douban.com").text
pattern=re.compile('(.*?)