常用模块之re模块以及正则表达式扩展

什么是模块?

   常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。

   但其实import加载的模块分为四个通用类别: 

  • 使用python编写的代码(.py文件)
  • 已被编译为共享库或DLL的C或C++扩展
  • 包好一组模块的包
  • 使用C编写并链接到python解释器的内置模块

为何要使用模块?

   如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。

    随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用

模块的使用

若想要使用一个模块,应该在程序开始的地方导入该模块,用  import 模块名

注意:

永远不要起一个py文件的名字,这个名字和你已知的模块同名

re模块中用到的几种方法

查找

findall:匹配所有内容,形成一个列表,每一项都是列表中的一个元素

ret = re.findall('d+','sjkhk172按实际花费928') #正则表达式匹配 多位数字,对象是后面的字符串
print(ret) >>> ['172', '928']

ret = re.findall('d','sjkhk172按实际花费928') # 正则表达式匹配数字
print(ret) >>> ['1', '7', '2', '9', '2', '8']

search:只匹配符合条件的从左到右的第一个,得到的不是直接结果,而是一个变量,通过此变量的group方法来获得最后结果

如果没有匹配到符合条件的,则会返回None,使用group会报错

日常使用推荐用search,findall因一次找到所有匹配项,占内存, match相当于search的正则表达式中加了一个"^"

ret = re.search('d+','sjkhk172按实际花费928')
print(ret)  >>><re.Match object; span=(5, 8), match='172'># 内存地址,这是一个正则匹配的结果
print(ret.group()) >>> 172# 通过ret.group()获取真正的结果

ret = re.search('d','owghabDJLBNdgv')
print(ret)
print(ret.group()) #正则没有匹配到,所以会报错

ret = re.search('d+','sjkhk3256按实际花费928')
if ret :   # 内存地址,这是一个正则匹配的结果
    print(ret.group()) >>> 3256 # 通过ret.group()获取真正的结果

match:从头开始匹配,相当于search中的正则表达式加上一个"^"

ret = re.match('d+','132sjkhk按156实际花费928')
print(ret.group()) >>> 132

字符串处理的扩展

split:切割

s = 'alex83taibai40egon25'
ret = re.split('d+',s)
print(ret) >>> ['alex', 'taibai', 'egon', ''] # 以数字切割,切割对象后面默认有一个字符
View Code

sub:替换

sub(旧,新,对象,替换次数)

ret = re.sub('d+','H','alex83taibai40egon25') # 默认全部替换
print(ret) >>> alexHtaibaiHegonH

ret = re.sub('d+','H','alex83taibai40egon25',1)  #替换一次
print(ret) >>> alexHtaibai40egon25
View Code

subn:也是替换,不过会返回一个元组,元组中第一个原始是替换后的结果,第二个元素是替换的次数

ret = re.subn('d+','H','alex83taibai40egon25')
print(ret) >>> ('alexHtaibaiHegonH', 3)
View Code

re模块的进阶

compile:节省使用正则表达式解决问题的时间,将正则表达式编译成字节码,多次使用过程中不会再多次编译,直接拿来用

ret = re.compile('d+')   # 已经完成编译了
print(ret)  >>> re.compile('\d+') #编译成原型
res = ret.findall('alex83taibai40egon25') # 拿来直接用
print(res)  >>> ['83', '40', '25']
res = ret.search('sjkhk172按实际花费928') #可以多次使用,不用再次编译
print(res.group()) >>> 172

finditer:节省使用正则表达式解决问题的空间,也就是内存

返回一个迭代器,所有的结果都在这个迭代器中,需要通过循环+group的形式取值 能够节省内存

ret = re.finditer('d+','alex83taibai40egon25')
print(ret) >>><callable_iterator object at 0x000001FE0DEE11D0> #调用/得到迭代器
for i in ret:
    print(i.group()) >>> 83 40 25

正则表达式的分组在re模块中的使用

#正常使用的正则表达式
s = '<a>wahaha</a>'  # 标签语言 html 网页
ret = re.search('(<w+>)(w+)(</w+>)',s)
print(ret.group())  >>> <a>wahaha</a> # 所有的结果
print(ret.group(1))  >>> <a># 数字参数代表的是取对应分组中的内容 第一个分组中的
print(ret.group(2)) >>> wahaha # 第二个分组中内容
print(ret.group(3))  >>> </a>
不在re模块中的正则表达式有分组

正则表达式的分组在热模块中,为了findall也可以顺利取到分组中的内容,有一个特殊的语法,优先显示分组中的内容

s = '<a>wahaha</a>'
ret = re.findall('(w+)',s)  
print(ret)  >>> ['a', 'wahaha', 'a']
ret = re.findall('>(w+)<',s)  #优先寻找匹配括号中的内容
print(ret) >>> ['wahaha']

如果想取消分组优先

形式:(?:正则表达式)

ret = re.findall('d+(.d+)','1.234*4') 
print(ret) >>> ['.234']

ret = re.findall('d+(?:.d+)','1.234*4') #取消了分组优先
print(ret) >>> ['1.234']

分组命名

形式: (?P<这个组的名字>正则表达式)

对于正则表达式来说 有些时候我们需要进行分组,来整体约束某一组字符出现的次数  (.[w]+)?

对于python语言来说 分组可以帮助你更好更精准的找到你真正需要的内容 <(w+)>(w+)</(w+)>

python和正则表达式之间有特殊的约定,要求使用这个名字的分组和前面同名分组中的内容匹配的必须一致

s = '<a>wahaha</a>'
pattern = '<(?P<tab>w+)>(w+)</(?P=tab)>'
ret = re.search(pattern,s)
print(ret.group()) >>> <a>wahaha</a>
#与 正则表达式(<w+>)(w+)(</w+>)效果是一样的
#如果正则表达式中有一模一样的表达式 就可以命名这个表达式,后面就可以直接套用名字

正则表达式使用技巧

#若我们现在想在一个字符串中取出所有的整数,我们是不是这么写
ret=re.findall(r"d+","1-2*(60+(-40.35/5)-(-4*3))")
#我们打印看看
print(ret) >>> ['1', '2', '60', '40', '35', '5', '4', '3']
#结果将其中小数分开也匹配上了,跟我们的需求不一样,因为我们是要取整数的,所以,我们要这么写.
原因:你要匹配的内容太没有特点了 容易和你不想匹配的内容混在一起

ret = re.findall(r"d+.d+|d+","1-2*(60+(-40.35/5)-(-4*3))")#将小数和整数都匹配出来
print(ret) >>> ['1', '2', '60', '40.35', '5', '4', '3']
ret = re.findall(r"d+.d+|(d+)","1-2*(60+(-40.35/5)-(-4*3))")
print(ret) >>> ['1', '2', '60', '', '5', '4', '3']
ret.remove('')
print(ret) >>> ['1', '2', '60', '5', '4', '3']
原文地址:https://www.cnblogs.com/--kai/p/9495190.html