Python--第二阶段--05.正则表达式

    技术2022-07-10  183

    正则表达式

    目的

    文本处理已经成为计算机常见工作之一;对文本内容的搜索,定位,提取是逻辑比较复杂的工作;为了快速方便的解决上述问题,产生了正则表达式技术。

    简介

    定义 即文本的高级匹配模式,提供搜索,替换等功能。其本质是由一系列字符和特殊符号构成的字串,这个字串即正则表达式。原理 通过普通字符和有特定含义的字符,来组成字符串,用以描述一定的字符串规则,比如:重复,位置等,来表达某类特定的字符串,进行匹配。目标 熟练掌握正则表达式元字符能够读懂常用正则表达式,编辑简单的正则规则能够熟练使用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+" # re方法直接调用findall l = re.findall(pattern,s) print(l) # compile对象调用findall方法 regex = re.compile(pattern) l = regex.findall(s) print(l) # compile对象调用findall方法,并传参 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+' # 返回迭代match对象 it = re.finditer(pattern,s) for i in it: print(i) print(i.group()) # 获取match对象对应的内容 fullmatch:完全匹配某个目标字符串,正则表达式必须完全匹配目标字符串 re_match = re.fullmatch(pattern,string,flags=0) 参数:pattern 正则表达式,string目标字符串,flags 功能标志位,扩展正则表达式的匹配 返回值:匹配不到内容返回none,匹配到内容则返回match对象。 import re s = "今年是2019年,建国70周年" # 返回match对象 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) # 生成match对象 # match的属性变量 print(match_obj.pos) # 目标字符串的开始位置 print(match_obj.endpos) # 目标字符串的结束位置 print(match_obj.re) # 正则 print(match_obj.string) # 目标字符串 print(match_obj.lastgroup) # 最后一组的组名 print(match_obj.lastindex) # 最后一组的序列号 # match对象的属性方法 print(match_obj.span()) # 匹配内容在字符串中的位置 print(match_obj.start()) # 起始位置 print(match_obj.end()) # 终止位置 print(match_obj.groupdict()) # 生成捕获组的字典 print(match_obj.groups()) # 子组对应内容的元组 print(match_obj.group()) # 获取match对象的内容,如果传入组号或者组名,则返回对应组的内容 print(match_obj.group(1)) print(match_obj.group('pig'))

    Processed: 0.010, SQL: 9