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

Posted --kai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用模块之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]

 

以上是关于常用模块之re模块以及正则表达式扩展的主要内容,如果未能解决你的问题,请参考以下文章

python常用模块之——正则re模块

python--常用模块之正则

常用模块之正则表达式模块

python之re模块

Python之常用模块re模块与logging模块和包

Python自动化运维之常用模块-re