正则表达式:是一种小型的、高度专业化的编程语言,它内嵌在python中,并通过re模块实现。正则表达式模式被编译成一些列的字节码,然后用C编写的匹配引擎执行。
用来匹配字符串
普通字符和元字符:
元字符:
. 通配符 ,代指所有的字符(除了换行符),一个点表示一个字符
>>> import re
>>> re.findall('w\w{2}l','hello world')
['worl']
>>> re.findall('w..l','hello world')
['worl']
>>> re.findall('w.l','hello world')
[]
^ 对字符串的开始进行匹配
>>> re.findall('^h...o','hjkjlkjjkhello')
[]
>>> re.findall('h...o','hjkjlkjjkhello')
['hello']
$ 匹配末尾的字符串
>>> re.findall('a..d$','hkekjannd')
['annd']
>>> re.findall('a..d$','hkekjanndy')
[]
* 重复匹配,重复前面一个字符多次匹配,可以是0次
>>> re.findall('a.*li','gjkjalexlifjjl')
['alexli']
>>> re.findall('sak*jl','gkskkkkkkkkjljkljl')
[]
>>> re.findall('sak*j','gkskkkkkkkkjljkljl')
[]
>>> re.findall('sk*j','gkskkkkkkkkjljkljl')
['skkkkkkkkj']
+ 重复匹配,重复前面一个字符多次匹配,从1开始匹配,最少就有一个字符
>>> re.findall('sk+j','gkskkkkkkkkjljkljl')
['skkkkkkkkj']
>>> re.findall('a+b','bbbaabx')
['aab']
>>> re.findall('a+b','bbbaabxaaabm')
['aab', 'aaab']
?重复匹配,匹配前面一个字符,只能是[0,1], 0次或者1次
>>> re.findall('a?b','bbbaabx')
['b', 'b', 'b', 'ab']
>>> re.findall('a?b','baabx')
['b', 'ab']
{} 重复匹配,自定义匹配次数,次数可以是一个范围 按最多的次数进行匹配(默认为贪婪匹配)
>>> re.findall('a{2}b','abb')
[]
>>> re.findall('a{2}b','aabbx')
['aab']
>>> re.findall('a{2}b','aaabbx')
['aab']
>>> re.findall('a{2}b','aaaabbx')
['aab']
>>> re.findall('a{1,3}b','aaaabbx')
['aaab']
>>>
>>> re.findall('a{1,3}b','aaaabbx')
['aaab']
>>>
>>> re.findall('a{2,3}b','abbx')
[]
小结:
* 等价于 {0,+∞}
+ 等价于 {1,+∞}
?等价于 {0,1}
>>> re.findall('abc*?','abcccc') #惰性匹配匹配最小值0 * 0-∞
['ab']
>>> re.findall('abc+?','abcccc') #惰性匹配 匹配最小值1 + 1-∞
['abc']
[ ] 字符集,取消元字符的特殊功能,将元字符写在中括号,但是( \ ^ - 例外)
>>> import re
>>> re.findall('a[c,d]x','acx')
['acx']
>>> re.findall('a[c,d]x','adx')
['adx']
>>> re.findall('a[c,d]x','acdx')
[]
>>> re.findall('a[c,d,r]x','arx')
['arx']
>>> re.findall('a[c,d,r]x','ar x')
[]
>>> re.findall('a[c,d,r, ]x','ar x')
[]
>>> re.findall('a[c,d,r, ]x','a x')
['a x']
>>>
>>> re.findall('[a-z]','a x')
['a', 'x']
>>> re.findall('v[a-z]i','vaoxi')
[]
>>> re.findall('v[a-z]i','vxi')
['vxi']
>>> re.findall('v[w,*]i','v*i')
['v*i']
>>> re.findall('v[w,*]i','vni')
[]
>>> re.findall('v[w,*]i','vwi')
['vwi']
>>> re.findall('[w,*,,]','vwi,')
['w', ',']
>>> re.findall('[1-9,a-z,A-Z]','13tyQW')
['1', '3', 't', 'y', 'Q', 'W']
>>> re.findall('1-9a-zA-z','13tyQW')
[]
>>> re.findall('[1-9a-zA-z]','13tyQW')
['1', '3', 't', 'y', 'Q', 'W']
[ ^ ] 中括号中^取反匹配
>>> re.findall('[^ty]','13tyQW')
['1', '3', 'Q', 'W']
>>> re.findall('[^1ty]','13tyQW')
['3', 'Q', 'W']
>>> re.findall('[^t,y]','13tyQW')
['1', '3', 'Q', 'W']
\ 反斜杠后跟元字符去除特殊功能,反斜杠后跟普通字符实现特殊功能
\d 匹配任何十进制数字, [0-9]
\D 匹配任何非数字字符, [^0-9]
>>> import re
>>> re.findall('\d{3}','qq23490208')
['234', '902']
>>> re.findall('\D','qq23490208')
['q', 'q']
\s 匹配任何空白字符,[\t\n\r\f\v]
\S 匹配任何非空白字符, [^\t\n\r\f\v]
>>> re.findall('\s{2}','qq23490208')
[]
>>> re.findall('\s{2}','qq 2 3 490208')
[]
>>> re.findall('\s','qq 2 3 490208')
[' ', ' ', ' ']
>>> re.findall('\S','qq 2 3 490208')
['q', 'q', '2', '3', '4', '9', '0', '2', '0', '8']
>>> re.findall('\S2','qq 2 3 490208')
['02']
>>> re.findall('\S4','qq 2 3 490208')
[]
>>> re.findall('\s2','qq 2 3 490208')
[' 2']
>>> re.findall('\s4','qq 2 3 490208')
[' 4']
\w 匹配任何字母数字字符,[a-zA-Z0-9]
\W 匹配任何非字母数字字符,[^a-zA-Z0-9]
>>> re.findall('\w','qq 2 3 490208')
['q', 'q', '2', '3', '4', '9', '0', '2', '0', '8']
>>> re.findall('\W','qq 2 3 490208')
[' ', ' ', ' ']
\b 匹配一个特殊字符边界,指单词和空格间或者特殊字符的位置边界
>>> re.findall(r'I\b','I am Ice')
['I']
>>> re.findall(r'I\b','I am I$e')
['I', 'I']
>>> re.findall(r'\bI','hello,I am uI$e')
['I']
>>> re.findall(r'\bI','hello,I am I$e')
['I', 'I']
re.search(), 匹配出找到的第一个结果用 group() 匹配结果值
>>> import re
>>> re.search('a..c','xxaauocl')
<_sre.SRE_Match object; span=(3, 7), match='auoc'>
>>> ret = re.search('a..c','xxaauocl')
>>> ret.group() #返回匹配的值
'auoc'
()正则表达式 进行分组匹配的字符
>>> re.search('(as)+','asdjkaskkoas').group() #(as)为一个整体进行匹配
'as'
>>> re.search('(as)|3','asdjkaskkoas').group() #| 管道符 为或者的意思
'as'
>>> re.search('(as)|3','asdjkaskkoas3').group() # 匹配到第一个
'as'
>>> re.search('(as)|3','3asdjkaskkoa').group()
'3'
>>> import re
>>> ret = re.search('(?P\d{3})','weeew34ttt123/ooo') #分组匹配 用括号括起来,其中?P为固定格式该组匹配的字符内容,可用group(’id‘)获取其该分组匹配值结果
>>> ret.group()
'123'
>>> ret = re.search('(?P\d{3})/(?P\w{3})','weeew34ttt123/ooo') #两个分组匹配id组和name组
>>> ret.group()
'123/ooo'
>>> ret.group('id') #id分组匹配结果值
'123'
>>> ret.group('name') #name分组匹配结果值
'ooo'
正则表达式的方法:
findall() 返回所有的结果,返回为list列表
>>> re.findall('www.(\w+).com','www.baidu.com') #返回括号分组的内容,返回’baidu‘
['baidu']
>>> re.search('www.(\w+).com','www.baidu.com').group() #用search()返回整个匹配的字串
'www.baidu.com'
>>> re.findall('www.(?:\w+).com','www.baidu.com') #findall() 组里面用?:方式取消组的优先级后返回整个字串
['www.baidu.com']
finditer()方法,生成迭代器,使用next方法获取匹配值
>>> ret = re.finditer('\d','q1w2e3r4t5y') #迭代器
>>> print(ret)
>>> next(ret)
<_sre.SRE_Match object; span=(1, 2), match='1'>
>>> next(ret).group() #获取匹配值
'2'
search() 返回一个对象,仅匹配第一个对象,使用group()方法获取返回结果
match() 只在字符串开始匹配,使用group() 方法获取返回结果
>>> ret = re.match('asd',"asd45ooolasde")
>>> ret.group()
'asd'
split() 以某个字符进行分割字符串
>>> import re
>>> re.split('[k,s]','djksal')
['dj', '', 'al'] #出现空格
>>> re.split('[ks]','djksal') #先以k进行分割后,再将分割后的字符串以s进行分割
['dj', '', 'al']
>>> re.split('[ks]','djkskasl') #先以k进行分割后,再将分割后的字符串以s进行分割
['dj', '', '', 'a', 'l']
sub() 替换功能,至少三个参数
>>> re.sub('a..x','s..b','hfjasalexxdhf')
'hfjass..bxdhf'
>>> import re
>>> re.sub('\d','A','q1w2e3r4t4y',1) #参数依次为: 要被匹配的字串内容, 替换为的字串,需要操作替换的整个字串,多个匹配替换的个数
'qAw2e3r4t4y'
>>> re.sub('\d','A','q1w2e3r4t4y',2)
'qAwAe3r4t4y'
>>> re.sub('\d','A','q1w2e3r4t4y',4)
'qAwAeArAt4y'
>>> re.sub('\d','A','q1w2e3r4t4y') #无替换个数参数直接全部替换
'qAwAeArAtAy'
compile() 创建匹配字符串对象
>>> obj = re.compile('\.com')
>>> obj.findall('fajfskjk.comfsdds') #直接对象使用方法
['.com']