正则表达式
目的
文本处理已经成为计算机常见工作之一;对文本内容的搜索,定位,提取是逻辑比较复杂的工作;为了快速方便的解决上述问题,产生了正则表达式技术。
简介
定义 即文本的高级匹配模式,提供搜索,替换等功能。其本质是由一系列字符和特殊符号构成的字串,这个字串即正则表达式。原理 通过普通字符和有特定含义的字符,来组成字符串,用以描述一定的字符串规则,比如:重复,位置等,来表达某类特定的字符串,进行匹配。目标
熟练掌握正则表达式元字符能够读懂常用正则表达式,编辑简单的正则规则能够熟练使用re模块操作正则表达式
元字符使用
元字符:有特殊含义的字符 图片来自网络,如有违权请留言,我一定第一时间删除~
匹配字符的元字符
用途元字符例子(直接复制运行需要把‘’改成英文的)备注
任意一个字符.re.findall(‘张.’,‘张三 张晓峰’)除换行符外字符集[字符集]re.findall(’[aeiou]’,‘hello world’)[abcd][0-9]/[a-z],[^]代表除了[]里面的都可以任意数字字符或非数字字符\d \Dre.findall(’\d{1,5}’,‘Mysql:3306,http:80’)[0-9]和 [ ^0-9] 作用一样任意普通字符或非普通字符/w /Wre.findall(’\w+’,‘Mysql=3306 http=80’)数字、字母、下划线、汉字及普通的UTF8字符任意空字符或非空字符\s \Sre.findall(’\S+’,‘hello wolrd\tshe is a pig’)空字符包括空格、\r 、\n、\t、\v、\f
匹配重复的元字符
用途元字符例子(直接复制运行需要把‘’改成英文的)备注
出现0次或多次*re.findall(‘wo*’,‘wooooo~w!’)出现1次或多次+re.findall(’[a-zA-Z]+’,‘James,hello’)出现0次或1次?re.findall(’-?[0-9]+’,‘12 32 -99 100’)出现n次{n}re.findall(’[0-9]{11}’,‘jams:13555555555’)出现n次出现m-n次{m,n}re.findall(’[0-9]{6,12}’,‘QQ1:123456 \n QQ2:458106428’)出现m到n次
匹配位置的元字符
用途元字符例子(直接复制运行需要把‘’改成英文的)备注
开头^ 或 \Are.findall(’^James’,‘James,hello’)在字符串开头结尾$ 或 \Zre.findall(‘James$’,‘hi,James’)在字符串结尾单词边界或非单词边界\b \Bre.findall(r’\bis\b’,‘This is a pig, is this?’)r是为了避免Python转义,单词边界即空格,开头,结尾,标点符号
其他元字符
用途元字符例子(直接复制运行需要把‘’改成英文的)备注
或|re.findall(‘ab|cd’,‘abcdefg’)前后两个条件满足一个就可以分组()re.search(r’(王|李)\S{1,4}’,‘王者荣耀 赵丽颖’).group()只改变重复元字符的作用对象,并且可以通过函数获取子组内容特殊字符\re.findall(’$\d+’,’$100 $2000’)如果匹配的字符和任意元字符相同,那就要在字符前加\
转义问题
匹配特殊字符时,加\ 由于Python会将字符串中的带\的字符转义,造成了我们写正则表达式的时候会少\,所以产生了原生字符串的概念。 Python中原生字符串:在字符串前面加r,则字符串中的特殊字符(\r,\t,\n,\v,\f)不转义。
贪婪模式和非贪婪模式
贪婪模式:默认情况下,匹配重复的元字符总是尽可能多的向后匹配内容。比如*?+{m,n}等。 非贪婪模式:在匹配元字符后加个?就转换为非贪婪模式了,匹配少的一个 eg:
贪婪模式(尽可能多的)非贪婪模式(尽可能少的)
re.findall(r’ab*’,‘abbbbbbbbbbcd’)re.findall(r’ab*?’,‘abbbbbbbbbbcd’)re.findall(r’ab+’,‘abbbbbbbbbbcd’)re.findall(r’ab+?’,‘abbbbbbbbbbcd’)re.findall(r’ab{3,5}’,‘abbbbbbbbbbcd’)re.findall(r’ab{3,5}?’,‘abbbbbbbbbbcd’)re.findall(r’ab*’,‘abbbbbbbbbbcd’)re.findall(r’ab*?’,‘abbbbbbbbbbcd’)
正则表达式的原则
正确性:能够正确的匹配出目标字符串。排他性:尽可能少的匹配其他内容。全面性:尽可能考虑到目标字符串的所有情况,不遗漏。
Python中的re模块
产生正则表达式对象的函数
compile:生成正则表达式对象
regex = re.compile(pattern,flags = 0)
参数:pattern 正则表达式、flags 功能标志位,扩展正则表达式的匹配
返回值:正则表达式对象
正则表达式对象的方法和re的方法
正则表达式对象和re均有相同的方法,只是参数有不同,下面以findall为例,其余函数均相似:
正则表达式对象和re都可用的方法
findall:根据正则表达式匹配目标字符串内容
list_re = re.findall(pattern,string,flags = 0)
re_obj = regex.findall(string,pos,endpos)
参数:pattern 正则表达式,string目标字符串,flags 功能标志位,扩展正则表达式的匹配,pos截取目标函数的开始匹配位置,endpos截取目标字符串的结束匹配位置,默认从头到尾。
返回值:匹配到的内容列表,如果正则表达式有子组则只能获取到子组对应的内容。
import re
s
= "alex:1994,ping:1998"
pattern
= r
"\w+:\d+"
l
= re
.findall
(pattern
,s
)
print(l
)
regex
= re
.compile(pattern
)
l
= regex
.findall
(s
)
print(l
)
m
= regex
.findall
(s
,0,12)
print(m
)
split:使用正则表达式匹配内容,切割目标字符串
表达式:re_list = re.split(pattern,string,flags = 0)
参数:参数:pattern 正则表达式、flags 功能标志位,扩展正则表达式的匹配
返回值:切割后的内容列表
import re
s
= "alex:1994,ping:1998"
n
= re
.split
(r
'[:,]',s
)
print(n
)
sub:使用一个字符串替换正则表达式匹配到的内容
re_str = re.sub(pattern,replace,string,max,flags = 0)
参数:pattern 正则表达式、replace替换的字符串,string目标字符串,max最多替换几处,默认替换全部,flags 功能标志位,扩展正则表达式的匹配
返回值:替换后的字符串。
subn和sub相同,知识返回值多了一个替换了几处。
import re
s
= "alex:1994,ping:1998"
n
= re
.sub
(r
':','-',s
)
print(n
)
e
= re
.subn
(r
':','-',s
)
print(e
)
正则表达式对象的属性方法
产生match对象的函数
产生match对象的函数–re和正则表达式对象都可使用
finditer:
re_iter = re.finditer(parttern,string,flags = 0)
参数:pattern 正则表达式,string目标字符串,flags 功能标志位,扩展正则表达式的匹配
返回值:返回一个匹配结果的可迭代match对象。
import re
s
= "今年是2019年,见过70周年"
pattern
= r
'\d+'
it
= re
.finditer
(pattern
,s
)
for i
in it
:
print(i
)
print(i
.group
())
fullmatch:完全匹配某个目标字符串,正则表达式必须完全匹配目标字符串
re_match = re.fullmatch(pattern,string,flags=0)
参数:pattern 正则表达式,string目标字符串,flags 功能标志位,扩展正则表达式的匹配
返回值:匹配不到内容返回none,匹配到内容则返回match对象。
import re
s
= "今年是2019年,建国70周年"
it
= re
.fullmatch
(r
'[,\w]+',s
)
print(it
.group
())
match:匹配某个目标字符串开始位置,相当于在字符串前加了^
re_match = re.match(parttern,string,flags = 0)
参数:pattern 正则表达式,string目标字符串,flags 功能标志位,扩展正则表达式的匹配
返回值:返回匹配内容的match对象
import re
s
= "今年是2019年,建国70周年"
it
= re
.match
(r
'[\w]+',s
)
print(it
.group
())
search:匹配第一个符合正则表达式的内容
re_match = re.seach(pattern,string,flags=0)
参数:pattern 正则表达式,string目标字符串,flags 功能标志位,扩展正则表达式的匹配
返回值:返回匹配内容的match对象
import re
s
= "今年是2019年,建国70周年"
it
= re
.search
(r
'[\w]+',s
)
it1
= re
.findall
(r
'[\w]+',s
)
print(it
.group
())
print(it1
)
match对象的属性方法
import re
pattern
= r
"(ab)cd(?P<pig>ef)"
regex
= re
.compile(pattern
)
match_obj
= regex
.search
('abcdefghi',0,8)
print(match_obj
.pos
)
print(match_obj
.endpos
)
print(match_obj
.re
)
print(match_obj
.string
)
print(match_obj
.lastgroup
)
print(match_obj
.lastindex
)
print(match_obj
.span
())
print(match_obj
.start
())
print(match_obj
.end
())
print(match_obj
.groupdict
())
print(match_obj
.groups
())
print(match_obj
.group
())
print(match_obj
.group
(1))
print(match_obj
.group
('pig'))