Python 中的re模块(regex)

Python 中的re模块

前言:什么是模块?

(1)什么是模块
  1. 模块就是功能的集合,是Python为了操作其他本身就存在的东西而提供的功能集合
  2. 如python中的os模块,就是python操作操作系统的功能集合
  3. 如在python中os.rename(),就是对文件重命名
  4. 如,操作系统本身就存在,Python是提供了一个模块os,用来在python中和操作系统交流
(2)Python 中模块类型
  1. 内置模块(python解释器自带的)
  2. 第三方模块(需要我们自己安装的模块)
  3. 自定义模块(自己写的模块)
模块怎么用
  1. import 模块名
  2. 自定义模块时,这个模块不能和已知的模块重名

Python 中的re模块(regex)

(1)查找
  1. re.findall(参数1,参数2,默认参数) ,参数1:正则表达式,参数2:待匹配字符串
import re
ret=re.findall(r'\d+','123123sad')#会全部匹配并把所有结果存放在列表中
print(ret)#输出结果为列表
#输出打印结果['123123']
  1. group(默认参数),默认参数0(整体打印),如果传入整数N,则意为输出第N
    组的匹配内容(没有该组报错),也可group(分组名)
  2. re.search(参数1,参数2,默认参数) ,参数1:正则表达式,参数2:待匹配字符串
import re
ret=re.match(r'\d+','123123sad')#只匹配从左到右的第一个结果,且不是直接结果,需要用group获取真正结果
print(ret)#输内存地址,正则匹配的结果
print(ret.group())#group()方法会默认提取分组第一个数据,如果返回结果为None,使用group会报错
#输出打印结果:
#<_sre.SRE_Match object; span=(0, 6), match='123123'>
#123123
  1. re.match(参数1,参数2,默认参数) ,参数1:正则表达式,参数2:待匹配字符串
  2. re.match()相当于search()中正则表达式上加^,表示从头匹配
(2)字符串处理和扩展(替换,切割)
  1. re.split(参数1,参数2,默认参数) ,参数1:正则表达式,参数2:待匹配字符串
import re
str1='123abc456efg789hij'
ret=re.split(r'\d+',str1)#按照正则表达式切割,切割后返回列表结果
print(ret)
#打印结果为:
#['', 'abc', 'efg', 'hij']
  1. re.sub(参数1,参数2,参数3,默认参数) ,参数1:正则表达式,参数2:替换成什么,
    参数3:字符串,默认参数:次数默认0(全部)
import re
str1='123abc456efg789hij'
ret=re.sub(r'\d+','你好',str1)#替换并返回新的字符串
print(ret)
#打印结果为:
#你好abc你好efg你好hij
  1. re.subn(),和re.sub传入参数一样,结果会返回元组,第一个是替换后字符串,第二个是替换次数
(3)re模块进阶(时间和空间)
  1. re.compile() ,节省那个使用正则表达式解决问题的时间(编译,先把正则编译成字节码)
import re
ret1=re.compile(r'\d+')#在这已经完成编译,并返回编译后的结果
print(ret1)#输出:re.compile('\\d+')
#此时再进行其他操作不需要再次编译,如findall
ret2=ret1.findall('123abc456efg789hij')
print(ret2)#输出:['123', '456', '789']
  1. re.finditer() ,节省那个使用正则表达式解决问题的空间(返回迭代器,节省内存)
import re
ret=re.finditer(r'\d+','123abc456efg789hij')#类似findall,只是把所有结果放在迭代器中
print(ret)#输出:<callable_iterator object at 0x0000000002F53EF0>
for ele in ret:
    print(ele)#输出结果类似search
    print(ele.group())#使用group获取真正结果
(4)在python中使用正则表达式的问题(分组问题)

1.search()中的分组问题

import re
str1='<a>123abc456efg789hij</a>'#标签语言,web(网页源码)
ret=re.search(r'>\w+<',str1)
print(ret.group())#此时输出>123abc456efg789hij<
ret=re.search(r'>(\w+)<',str1)#在正则表达式中分一个组
print(ret.group(1))#此时输出123abc456efg789hij,打印的为正则表达式第一组的内容
ret=re.search(r'<(\w+)>(\w+)<(\w+)>',str1)
ret=re.search(r'<(\w+)>(\w+)</(\w+)>',str1)
print(ret.group(1))#此时输出a,打印的为正则表达式第一组的内容
print(ret.group(2))#输出123abc456efg789hij,打印的为正则表达式第二组的内容
print(ret.group(3))#此时输出a,打印的为正则表达式第三组的内容
  1. findall()中的分组问题
import re
str1='123abc4.56efg7.89hij'
ret=re.findall(r'\d+(.\d+)?',str1)#分组优先,python和正则之间的约定,可以用(?:)取消分组优先
print(ret)#此时输出:由于分组优先问题打印['', '.56', '.89']
ret=re.findall(r'\d+(?:.\d+)?',str1)#(后加?:取消分组优先
print(ret)
  1. re.split()中的分组问题
import re
str1='123abc456efg789hij'
ret=re.split(r'(\d+)',str1)#加分组会保留分组中的内容
print(ret)#切割后返回列表
#打印结果为:
#['', '123', 'abc', '456', 'efg', '789', 'hij']
(5)使用正则表达式的技巧
  1. 分组命名(?P正则表达式) ,name不能用数字,否则会报错
import re
str1='123abc456efg789hij'
ret=re.search(r'(?P<count>\d+)',str1)#search时给分组命名
print(ret.group(1))#打印123 ,按组号查找返回结果
print(ret.group('count'))#打印123 ,按组名查找返回结果
  1. 分组的好处
#匹配网页源码时
import re
str1='<a>123abc456efg789hij</a>'#<>里是标签名,成对出现,否则不合法
ret=re.search(r'<(?P<tab>\w+)>\w+</(?P=tab)>',str1)
print(ret.group())#此时输出<a>123abc456efg789hij</a>
#如果标签不成对
str1='<a>123abc456efg789hij</b>'#<>里是标签名,成对出现,否则不合法
ret=re.search(r'<(?P<tab>\w+)>\w+</(?P=tab)>',str1)
print(ret)#此时输出None
发布了66 篇原创文章 · 获赞 7 · 访问量 2383

猜你喜欢

转载自blog.csdn.net/qq_45894553/article/details/104773707