正则表达式
正则表达式:
一,简介:
正则表达式(或RE)是一种小型的,高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现,再被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行
元字符:
.匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。
^匹配输入字符串的开始位置\^
$匹配输入字符串的结尾位置
*匹配当前子表达式0次或者多次
+匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+
?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?
{}匹配前一个字符m次
[]常用来制定一个字符集,如[ab]匹配 a 或b;其他的元字符在[]中不起作用,除了【-】【^】
|指明两项之间的一个选择。要匹配 |,请使用 \|
()被括起来的表达式将作为分组盲么,从表达式左边开始遇到每一个分组左括号(编号+1)
另外,分组表达式作为一个整体,可以后接数量词,表达式中 | 仅在改组有效
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符
import re print(re.findall('q.w','dsqdw')) #通配符匹配一个字符
print(re.findall('q..w','dsqdgw'))# 匹配内容之间的内容 print(re.findall('a\.c','dsa.cdc')) #转义字符 使后一个字符改变原来的意思 D:\python3.5\python.exe D:/untitled/python3/day正则练习.py ['qdw'] ['a.c'] Process finished with exit code 0
import re print(re.findall('^a','asd')) print(re.findall('^as','asdf')) print(re.findall('^asd','asdfd')) print(re.findall('[^1-9]','ww3aa8.d')),'ww3aa8.d')) D:\python3.5\python.exe D:/untitled/python3/lianxi.py ['a'] ['as'] ['asd'] ['w', 'w', 'a', 'a', '.', 'd'] Process finished with exit code 0
print(re.findall('as$','dfas')) print(re.findall('fd$','asdfd')) print(re.findall('[1-9$]','ww3aa8.d')) D:\python3.5\python.exe D:/untitled/python3/lianxi.py ['as'] ['fd'] ['3', '8'] Process finished with exit code 0
import re print(re.findall('abc*','abcdefg')) print(re.findall('as*','asssssddd')) D:\python3.5\python.exe D:/untitled/python3/lianxi.py ['abc'] ['asssssss'] Process finished with exit code 0
print(re.findall('as+','asddddd')) print(re.findall('sd+','asdwsdd')) D:\python3.5\python.exe D:/untitled/python3/lianxi.py ['as'] ['sd', 'sdd']
print(re.findall('asc?','asa')) print(re.findall('azx?','azxazxs')) D:\python3.5\python.exe D:/untitled/python3/lianxi.py ['as'] ['azx', 'azx'] Process finished with exit code 0
print(re.findall('ac{1}b','acbcc')) 匹配前一个字符m次或n次 print(re.findall('ab{1,2}c','abbcbb')) D:\python3.5\python.exe D:/untitled/python3/lianxi.py ['acb'] ['abbc'] Process finished with exit code 0
print(re.findall('z[ds]','ewzds')) print(re.findall('z[cs]','ewz')) D:\python3.5\python.exe D:/untitled/python3/day正则练习.py ['zd'] ['zc'] Process finished with exit code 0
print(re.findall('zx|xz','zxssxzss')) print(re.findall('zxc|cxz','sdzxcscxzds')) D:\python3.5\python.exe D:/untitled/python3/lianxi.py ['zx', 'xz'] ['zxc', 'cxz'] Process finished with exit code 0
print(re.findall('(asd)','asdasdasd')) print(re.findall('za','aszasdza')) print(re.findall('(za){2}',"zaza")) print(re.findall('a(12)|(23)c','a123c D:\python3.5\python.exe D:/untitled/python3/lianxi.py ['asd', 'asd', 'asd'] ['za', 'za'] ['za'] [('12', '')] Process finished with exit code 0
print(re.findall('a\.c','a.csd')) print(re.findall(r'a\\c','a\cd')) D:\python3.5\python.exe D:/untitled/python3/lianxi.py ['a.c'] ['a\\c'] Process finished with exit code 0
\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]
\b: 匹配一个单词边界,也就是指单词和空格间的位置。 单词中间的符号代表两个,两边代表两个
\b 就是用在你匹配整个单词的时候。 如果不是整个单词就不匹配。
(r'\d*','xin123456789')) #输出数字 print(re.findall(r'\D*','kai1234!@#$%45623')) #非数字 print(re.findall(r'\s*','kai 5132')) #匹配所有的空格 print(re.findall(r'\S*','kai8465')) #匹配非空白字符串 print(re.findall(r'\w*','kai#2454#%^%$#')) #匹配任何数字,字符串 print(re.findall(r'\W*','kai^%$#5632')) #匹配任何非字符和数字 print(re.findall(r'\b','asdadda')) #匹配一个单词边界,也就是指单词和空格键的位置 print(re.findall(r'\bxin','xin,sad')) #匹配单词:
re模块的内置功能:
compile()
编译正则表达式模式,返回一个对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)
语法:
re.compile(pattern,flags=0)
pattern: 编译时用的表达式字符串。
flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。常用的flags有:
rr = 'kai xin is sd sood gesd good ' xx = re.compile(r'\w*oo\w*') print(xx.findall(rr)) D:\python3.5\python.exe D:/untitled/python3/day正则练习.py ['sood', 'good'] Process finished with exit code 0
re.I 使匹配对大小写都不敏感
re.M 多行匹配,影响^ 和$
re.S 使 .匹配包括换行在内的所有字符,每行都匹配
re.L 做本地化识别(locale- aware)匹配
re.U 根据Unicode 字符集解析字符,这个标志影响\w \W;\b\B
re.X 通过更灵活的格式以便将正则表达式写的更易于理解
xin = re.findall('.','asd\nds',re.S) print(xin) #匹配所有字符包括换行符 print (re.findall('.','sa\nas',re.M)) print (re.findall('.','sa\nas',re.S))# 匹配任何字符包括换行符在内 D:\python3.5\python.exe D:/untitled/python3/day正则练习.py ['a', 's', 'd', '\n', 'd', 's'] ['s', 'a', 'a', 's'] ['s', 'a', '\n', 'a', 's'] Process finished with exit code 0
search 浏览全部字符串,匹配第一个符合规则的字符串
语法:search:re.search(pattren,string,filsgs= 0)
一旦匹配成功,就是一个match object 对象,
而match object 对象拥有以下方法:
group() 返回被 RE 匹配的字符串
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配 (开始,结束) 的位置
group() 返回re整体匹配的字符串,可以一次输入多个组号,对应组号匹配的字符串
1. group()返回re整体匹配的字符串,
2. group (n,m) 返回组号为n,m所匹配的字符串,如果组号不存在,则返回indexError异常
3.groups() 方法返回一个包含正则表达式中所有小组字符串的元组,从 1 到所含的小组号,通常groups()不需要参数,返回一个元组,元组中的元就是正则表达式中定义的组。
print(re.search('\dcom','wee.4comsdda.5com').group())# 匹配数字后有com的 print(re.search('\dcom','ww.5comdsada.2com').group()) #5com 返回被RE匹配的字符串 print(re.search('\dcom','wdd.5comsads.2com').start()) #匹配开始的位置 print(re.search('\dcom','www.5comsa.2com').end()) #匹配结束的位置 print(re.search('\dcom','wdd.5comsdad.2com').span()) #匹配开始结束的位置 xin = re.search('([\d]*)([a-z]*)([\d]*)','123dbc452').groups() print(xin) # 返回一个包含正则式中所有字符串的元祖
a = '123xin321' print(re.search("([\d]*)([a-z]*)([\d]*)",a).group(0)) #默认0匹配的全部租 print(re.search('([\d]*)([a-z]*)([\d]*)',a).group(1)) #匹配第一个组 print(re.search('([\d]*)([a-z]*)([\d]*)',a).group(2)) #匹配第二个组 print(re.search('([\d]*)([a-z]*)([\d]*)',a).group(3)) #匹配第三个组
分组:
xin = 'guo kai xin hoaniubi 19' kai =re.search('(\w+)',xin) print(kai.group()) print(kai.groups()) print(kai.groupdict()) D:\python3.5\python.exe D:/untitled/python3/day正则练习.py guo ('guo',) {} ds = 'sdfghjz x cvbn msd fghjdcvbnm10' s = re.search('(\w+).*(?P<name>\d)$',ds) print(s.group()) print(s.groups()) #()组 print(s.groupdict()) D:\python3.5\python.exe D:/untitled/python3/day正则练习.py sdfghjz x cvbn msd fghjdcvbnm10 ('sdfghjz', '0') {'name': '0'} Process finished with exit code 0
matoch 只匹配开头
re.match(pattern,string,flags=0)
flags 编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小 多行匹配等
print(re.match('XIN','XINxsss.dhsajk').group()) #区分大小写 print(re.match('xin','Xinsdasd.dsad',re.I).group()) #加上I就不区分大小写 D:\python3.5\python.exe D:/untitled/python3/day正则练习.py XIN Xin Process finished with exit code 0
分组:
xin = 'kai xin guo xiao huo zi' kai = re.match('k\w+',xin) print(kai.group()) #获取匹配开头的所有结果 print(kai.groups()) #获取模型中匹配到的分组结果 print(kai.groupdict()) #获取模型中匹配到的分组结果 # 执行结果: kai () {} 有分组: 为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来) xin = 'kai xin guo xiao huo zi' kai = re.match('k(\w+)',xin) print(kai.group()) #获取匹配开头的所有结果 print(kai.groups()) #获取模型中匹配到的分组结果 print(kai.groupdict()) #获取模型中匹配到的分组结果 #执行结果: kai ('ai',) {} kai = re.match('(k)(\w+)',xin)#获取匹配开头的所有结果 print(kai.group()) print(kai.groups()) print(kai.groupdict()) 执行结果: kai ('k', 'ai') {} kai = re.match('(?P<n1>k)(?P<n2>\w+)',xin) print(kai.group()) print(kai.groups()) print(kai.groupdict()) #?p<n1> 代表gpoutdict中的key 执行结果: kai ('k', 'ai') {'n2': 'ai', 'n1': 'k'}
print(re.match('xin$','Xinsdasd.dsad',re.I)) D:\python3.5\python.exe D:/untitled/python3/day正则练习.py None Process finished with exit code 0 以***开始匹配,¥以***结尾的 sum = re.match("(.*xin$)","xindffsfsdf.xin").group() print(sum) D:\python3.5\python.exe D:/untitled/python3/day正则练习.py xindffsfsdf.xin Process finished with exit code 0 这是个疑难杂症
xin = 'guo4kai5xin' kai = re.sub('\d+','xxx',xin) print(kai) 打印结果 guoxxxkaixxxxin
sub:
替换string中每一个匹配的子串后返回替换后的字符串
语法re.sub(pattern,repl,steing,,max(0))
subn:
替换的次数
xin = 'guo4kai5xin' new_str,count = re.subn('\d+','xxx',xin) print(new_str,count) 打印结果 guoxxxkaixxxxin 2
import re xin = re.sub('x.i','xin','I xi Z,I xi A I xi B') print(xin) print(re.sub('[1-3]','S','SSSS12346')) print(re.subn('k.i','xin','I kai A I kai B I kaiC')) print(re.subn('[1-3]','s','ss132456')) D:\python3.5\python.exe D:/untitled/python3/lianxi.py I xi Z,I xi A I xi B SSSSSSS46 ('I xin A I xin B I xinC', 3) ('sssss456', 3) Process finished with exit code 0
split:
分割 切片函数。使用指定的正则规则在目标字符串中查找匹配的字符串,用它们作为分界,把字符串切片
x = re.compile(r'\d+') print(x.split('q1q2q3')) print(re.split('\d','q1q2q3')) print(re.split('[a-z]','q1q2q3')) D:\python3.5\python.exe D:/untitled/python3/lianxi.py ['q', 'q', 'q', ''] ['q', 'q', 'q', ''] ['', '1', '2', '3'] Process finished with exit code 0 s = 'q1,q2,q3' print(re.split('/s*/s*',s)) D:\python3.5\python.exe D:/untitled/python3/lianxi.py ['q1,q2,q3'] Process finished with exit code 0
又无分组: 无分组 xin = 'hello and xin aos erpi 20' kai = re.split('a\w+',xin,) print(kai) kai = re.split('a\w+',xin,1) #分割一次 print(kai) 打印结果 ['hello ', ' xin ', ' erpi 20'] ['hello ', ' xin aos erpi 20'] 有分组 kai = re.split('(a\w+)',xin,) print(kai) kai = re.split('(a\w+)',xin,1) print(kai) kai = re.split('a(\w+)',xin,1) print(kai) 打印结果 ['k', 'ai', ' xin guo xi', 'ao', ' huo zi'] ['k', 'ai', ' xin guo xiao huo zi'] ['k', 'i', ' xin guo xiao huo zi']
findall()以列表形式返回所有匹配的字符串,可以获取字符串中所有匹配的字符串
p = re.compile(r'\d+') print(p.findall('one1two2three3four4')) #匹配所有的数字 text = 'JGood is a handsome boy,he is,handsome and cool,clever,ane so on...' print(re.findall(r'\w*oo\w',text)) #匹配前后都有字符,中间是00的 print(re.findall(r'(\w)*oo(\w)*',text)) #表示子表达式 D:\python3.5\python.exe D:/untitled/python3/lianxi.py ['1', '2', '3', '4'] ['JGood', 'cool'] [('G', 'd'), ('c', 'l')] Process finished with exit code 0
有无分组 n = re.findall('\d+\w\d+','q2b3c4d5') print(n) #从前向后匹配 \d 数字 \w 字母 n = re.findall('(\d+)(\w)*(\d+)','q2b3c4d5') print(n) 打印结果 ['2b3', '4d5'] [('2', 'd', '5')] kai = 'guo kaixin fe' # 默认的都是goups模式 xin = re.findall('k\w+',kai) print(xin) xin = re.findall('(k\w+)',kai) print(xin) xin = re.findall('(k)(\w+)',kai) print(xin) xin = re.findall('(k)(\w+)(n)',kai) print(xin) xin = re.findall('(k)(\w+(i))(n)',kai) print(xin) 打印结果: ['kaixin'] ['kaixin'] [('k', 'aixin')] [('k', 'aixi', 'n')] [('k', 'aixi', 'i', 'n')] n = re.findall('(\ddsa)*','as5dsangnb5dsaare') print(n) n = re.findall('(\ddsa)+','as5dsangnb5dsaare') print(n) 打印结果 ['', '', '5dsa', '', '', '', '', '5dsa', '', '', '', ''] ['5dsa', '5dsa']
finditer 搜索string 返回一个顺序访问每一个匹配结果(Match对象)的迭代器
p = re.compile(r'\d+') for i in p.finditer('q1,q2,q3'): print(i.group()) D:\python3.5\python.exe D:/untitled/python3/lianxi.py 1 2 3 Process finished with exit code 0 p = re.compile(r'\d+') for i in p.finditer('q1,q2,q3'): print(i.span()) D:\python3.5\python.exe D:/untitled/python3/lianxi.py (1, 2) (4, 5) (7, 8) Process finished with exit code 0