常见的正则表达式功能介绍
正则表达式 | 功能说明 |
. | 表示一个除换行符( )外的所有字符 |
^ | 表示输入行的开始 |
$ |
表示输入行的结束 |
* | 表示前一个项目可以出现0次或者无数次 |
+ | 表示前一个项目可以出现1次或者无数次 |
? | 表示前一个项目可以出现0次或者1次 |
[abc] | 表示一个符合a或b或c的任何字符 |
[a-z] | 表示一个符合a~z的任何字符 |
表示后面的字符以常规字符处理 | |
{m} | 表示前一个项目必须正好出现m次 |
{m,} | 表示前一个项目至少出现m次,最多可出现无数次 |
{m,n} | 表示前一个项目至少出现m次,最多出现n次 |
d | 表示一个数字,相当于[0123456789]或[0-9] |
^ | 求反运算,例如[^a-d]表示除a、b、c、d外的所有字符 |
D | 一个非数字字符,相当于[^0-9] |
换行符 | |
回车符(carriage renturn) | |
tab 制表符 | |
s | 空格符,相当于[ f] |
S | 非空格符,相当于[^ f] |
w | 一个数字、字母或下划线字符,相当于[0-9a-zA-Z_] |
W | 一个非数字、字母或下划线字符,相当于[^w],即[^0-9a-zA-Z_] |
A | 匹配字符串开始 |
匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 | |
z | 匹配字符串结束 |
G | 匹配最后匹配完成的位置 |
a|b | 匹配a或b |
() | 匹配括号内的表达式,也表示一个组 |
re.match
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
re.match(pattern, string, flags=0)
最常规的匹配
1 import re 2 3 content = 'Hello 123 4567 World_This is a Regex Demo' 4 print(len(content)) 5 result = re.match('^Hellosdddsd{4}sw{10}.*Demo$', content) 6 print(result) 7 print(result.group()) 8 print(result.span())
泛匹配
1 import re 2 3 content = 'Hello 123 4567 World_This is a Regex Demo' 4 result = re.match('^Hello.*Demo$', content) 5 print(result) 6 print(result.group()) 7 print(result.span())
匹配目标
1 import re 2 3 content = 'Hello 1234567 World_This is a Regex Demo' 4 result = re.match('^Hellos(d+)sWorld.*Demo$', content) 5 print(result) 6 print(result.group(1)) 7 print(result.span())
贪婪匹配
1 import re 2 3 content = 'Hello 1234567 World_This is a Regex Demo' 4 result = re.match('^He.*(d+).*Demo$', content) 5 print(result) 6 print(result.group(1))
非贪婪匹配
1 content = 'Hello 1234567 World_This is a Regex Demo' 2 result = re.match('^He.*?(d+).*Demo$', content) 3 print(result) 4 print(result.group(1))
匹配模式
1 import re 2 3 content = '''Hello 1234567 World_This 4 is a Regex Demo 5 ''' 6 result = re.match('^He.*?(d+).*?Demo$', content, re.S) 7 print(result.group(1))
转义
1 import re 2 3 content = 'price is $5.00' 4 result = re.match('price is $5.00', content) 5 print(result)
总结:尽量使用泛匹配、使用括号得到匹配目标、尽量使用非贪婪模式、有换行符就用re.S
re.search
re.search 扫描整个字符串并返回第一个成功的匹配。
1 import re 2 3 content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings' 4 result = re.match('Hello.*?(d+).*?Demo', content) 5 print(result)
1 import re 2 3 content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings' 4 result = re.search('Hello.*?(d+).*?Demo', content) 5 print(result) 6 print(result.group(1))
总结:为匹配方便,能用search就不用match
re.findall
搜索字符串,以列表形式返回全部能匹配的子串。
1 import re 2 3 html = '''<div id="songs-list"> 4 <h2 class="title">经典老歌</h2> 5 <p class="introduction"> 6 经典老歌列表 7 </p> 8 <ul id="list" class="list-group"> 9 <li data-view="2">一路上有你</li> 10 <li data-view="7"> 11 <a href="/2.mp3" singer="任贤齐">沧海一声笑</a> 12 </li> 13 <li data-view="4" class="active"> 14 <a href="/3.mp3" singer="齐秦">往事随风</a> 15 </li> 16 <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li> 17 <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li> 18 <li data-view="5"> 19 <a href="/6.mp3" singer="邓丽君">但愿人长久</a> 20 </li> 21 </ul> 22 </div>''' 23 results = re.findall('<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>', html, re.S) 24 print(results) 25 print(type(results)) 26 for result in results: 27 print(result) 28 print(result[0], result[1], result[2])
re.sub
替换字符串中每一个匹配的子串后返回替换后的字符串。
1 import re 2 3 content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings' 4 content = re.sub('d+', 'Replacement', content) 5 print(content)
1 import re 2 3 content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings' 4 content = re.sub('(d+)', r'1 8910', content) 5 print(content)
re.compile
将正则字符串编译成正则表达式对象
将一个正则表达式串编译成正则对象,以便于复用该匹配模式
1 import re 2 3 content = '''Hello 1234567 World_This 4 is a Regex Demo''' 5 pattern = re.compile('Hello.*Demo', re.S) 6 result = re.match(pattern, content) 7 #result = re.match('Hello.*Demo', content, re.S) 8 print(result)