正则基础与进阶
正则基础:
# 正则基础: # 1.正则表达式 # 字符串处理工具 注意:需要导入re模块 特点:语法复杂、可读性差、但通用性强,可用于多种编程语言 import re # 步骤: # 1.导入模块 # 2.使用match()方法进行匹配 # 3.re.match()能匹配出xxx开头的字符串 # 4.如果起始位置没有匹配成功,返回None # re.match(pattern,string,flags) # pattern 匹配的正则表达式 string 要匹配的字符串 # res = re.match('su','suyikaichishi') # print(res) # 如果上一步数据匹配成功,使用group()提取数据 # print(res.group()) # 注意:match()是从开始位置匹配,匹配不到就None# 2.匹配单个字符 # . 匹配任意一个字符,除\n --常用 # res = re.match('..','hello') # print(res.group()) # []匹配[]中列举的字符 --常用 # res = re.match('[suyikai]','suyikaiaichishi') # res = re.match('[1-4]','423') # 匹配0-9第一种写法 # res = re.match('[0123456789]','8961651') # 匹配0-9第二种写法 # res = re.match('[0-9]','16516152') # res = re.match('[a-zA-Z]','hello') #a-zA-Z代表列举出所有大小写字母 # print(res.group()) # 3. \d 匹配数字0-9 --常用 # res = re.match('\d','1234') # print(res.group()) # 4. \D匹配非数字 --常用 # res = re.match('\D','s123') #\D只要不是数字都能匹配 # print(res.group()) # 5. \s 匹配空白,即 空格和tab键 # res = re.match('\s.........',' hello') # print(res.group()) # 6. \S 匹配非空白 # res = re.match('\S','’ss') # print(res.group()) # 7. \w 匹配单词字符,即a-z,A-Z,0-9,_,汉字 --常用 # res = re.match('\w','呼呼呼') # print(res.group()) # 8. /W 匹配非单词字符 # res = re.match('\W','..') # print(res.group())# 3.匹配多个字符: # 1.*匹配前一个字符出现0次或者无限次,即可有可无 --常用 # res = re.match('\d*','suyikai') # print(res.group()) # 2.+匹配前一个字符出现一次或者无限次,即至少有一次 --常用 # res = re.match('\w+','aichishi') # print(res.group()) # 3.?匹配前一个字符出现一次或者0次 --常用 # res = re.match('\d?','1hello') # print(res.group()) # 4.{m} 匹配前一个字符出现m次 # res = re.match('\w{3}','python') # print(res.group()) # 5.{m,n} 匹配前一个字符出现从m次到n次 # 注意:必须符合m<n的条件 # res = re.match('\w{3,9}','python') # print(res.group())# 4.匹配开头和结尾 # 1.^:表示以...开头,表示对...取反 # res = re.match('^py','python') # print(res.group()) # 注意:^再[]中表示不匹配 # res = re.match('[^py]','1234python') #[^py]表示匹配除了p、y之外的字符 # print(res.group()) # 2.$ 匹配字符串结尾 匹配以...结尾 # res = re.match('.{9}i$','suyikaikai') # print(res.group())
正则进阶:
# 正则进阶 # 导入模块 import re # 一.匹配分组 # 1.| 匹配左右任意一个表达式 --常用 # res = re.match('abc|def','abc') # print(res.group()) # 2.(ab)将括号中字符作为一个分组 --常用 # res = re.match('\w*@(163|qq|126).com','123@163.com') # print(res.group()) # 3.\num 匹配分组num匹配到的字符串 --经常再匹配标签时被使用 # res = re.match('<\w*>\w*</\w*>','<html>login</html>') # res = re.match('<(\w*)>\w*</\\1>','<html>login</html>') # res = re.match(r'<(\w*)><(\w*)>.*</\2></\1>','<html><body>login</body></html>') # print(res.group()) # 注意:从外到内排序,编号从1开始 # 4.(?P<name>) 分组起别名 # 5.(?P=name) 引用别名为name分组匹配到的字符串 # res = re.match(r'<(?P<L1>\w*)><(?P<L2>\w*)>.*</(?P=L2)></(?P=L1)>','<html><body>login</body></html>') # print(res.group())# 匹配网址 前缀一般是www,后缀:.com .cn li = ['www.baidu.com','www.python.org','http.jd.cn','www.py.en','www.abc.cn'] # res = re.match(r'www(\.)\w*\1(com|cn|org)','www.baidu.com') # print(res.group()) for i in li:res = re.match(r'www(\.)\w*\1(com|cn|org)', i)if res != None:print(res.group())else:print(f'{i} have error')
# 高级用法: # 1.search():扫描整个字符串并返回第一个成功匹配的对象,如果失败,就返回None # res = re.search('\d','p1ython') # print(res.group()) # 2.findall():从头到尾匹配,找到所有匹配成功的数据,返回一个列表 # res = re.findall('th','p1ythothn') # print(res)# 总结: # match():从头开始匹配,匹配成功返回match对象,通过group()方法进行提取,匹配失败就返回None,只能匹配一次 # search():从头到尾匹配,匹配成功返回第一个成功匹配的对象,通过group()进行提取,匹配失败返回None
# sub() # re.sub(pattern,repl,string,count) # pattern:正则表达式(代表需要被替换的,也就是字符串里的旧内容) # repl:新内容 # string:字符串 # count:指定替换的次数 # res = re.sub('shi','xiang','aichishi',1) # print(res) # res = re.sub('\d','2','这是这个月的第30天',1) # print(res)# split # re.split(pattern,string,maxsplit) # pattern:正则表达式(代表需要被替换的,也就是字符串里的旧内容) # string:字符串 # maxsplit:指定最大分割次数 # res = re.split(',','hello,python') #没有默认次数,就默认全部分割 # print(res)# 贪婪与非贪婪 # 贪婪匹配(默认):在满足匹配时,匹配尽可能长的字符串 # res = re.match('em*','emmmmmmm') # print(res.group()) # 非贪婪匹配:在满足匹配时,匹配尽可能短的字符串,使用?来表示非贪婪匹配 # res = re.match('em+?','emmmmmmm') # print(res.group()) # res = re.match('m{1,5}?','mmmm') # print(res.group())# 原生字符串: # print('xiaohan\\bao') res = re.match('\\\\','\game') print(res.group()) # 正则表达式中,匹配字符串中的字符\需要四个\\\\,加入原生字符串,\\代表\