Python正则表达式

常见的正则表达式功能介绍

正则表达式 功能说明
. 表示一个除换行符(\n)外的所有字符
^ 表示输入行的开始
$
表示输入行的结束
* 表示前一个项目可以出现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]
\n 换行符
\r 回车符(carriage renturn)
\t tab 制表符
\s 空格符,相当于[\r\t\n\f]
\S 非空格符,相当于[^\r\t\n\f]
\w 一个数字、字母或下划线字符,相当于[0-9a-zA-Z_]
\W 一个非数字、字母或下划线字符,相当于[^\w],即[^0-9a-zA-Z_]
\A 匹配字符串开始
\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串
\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('^Hello\s\d\d\d\s\d{4}\s\w{10}.*Demo$', content)
6 print(result)
7 print(result.group())
8 print(result.span())
View Code

 

泛匹配

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())
View Code

 

匹配目标

1 import re
2 
3 content = 'Hello 1234567 World_This is a Regex Demo'
4 result = re.match('^Hello\s(\d+)\sWorld.*Demo$', content)
5 print(result)
6 print(result.group(1))
7 print(result.span())
View Code

 

贪婪匹配

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))
View Code

 

非贪婪匹配

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))
View Code

 

匹配模式

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))
View Code

 

转义

1 import re
2 
3 content = 'price is $5.00'
4 result = re.match('price is \$5\.00', content)
5 print(result)
View Code

 

总结:尽量使用泛匹配、使用括号得到匹配目标、尽量使用非贪婪模式、有换行符就用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)
View Code
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))
View Code

 

总结:为匹配方便,能用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])
View Code

 

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)
View Code
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)
View Code

 

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)
View Code

 

posted @ 2018-06-03 22:01  网络迷途者  阅读(201)  评论(0编辑  收藏  举报