python之正则

时间:2024-04-06 15:55:33

前言

说到正则,我真是又爱又恨,爱的原因是Python通过正则可以处理大部分文本字符串,恨的原因是正则的模式表示法很难记,比较麻烦,所以我写下这篇文章主要是为了帮助自己记忆和巩固。

正则表示法

python之正则
python之正则
下面选几个比较难理解的说一下

  1. […]:使用中括号时,表示只要…有的,都可以匹配到,但是当你将各种符号组合使用时,如匹配以net或com为后缀的网址时(www.sdsd.com):
www\.\w+\.(net|com) #但是你不能写成 www\.\w+\.[net|com]

因为[…]只会匹配一个单一字符,所以这种时候不能用[],否则只会匹配到
www.sdsd.c 而不是www.sdsd.com

  1. (*^)?:如果在符号后面加上?表示此符号为非贪婪匹配(默认正则是贪婪匹配,即尽可能地匹配更多的字符串)

Python的re模块

python之正则

compile()

此模块中的compile()返回一个正则表达式对象,python在模式匹配前,首先会将模式编译成正则表达式对象,所以当你使用compile()函数预先编译好后,python就不需要重复编译成正则表达式对象,当重复使用某一模式匹配时会大大提高了程序的执行效率
即:

import re
s1='www.aaaa.com'
s2='www.asdsd.net'
a=re.match('net|com',s1).group()
b=re.match(‘net|com’,s2).group()
print(a,b)#效率低
--------------------------------------------------------
import re
s1='www.aaaa.com'
s2='www.asdsd.net'
z=re.comepile('net|com')
a=re.match(z,s1).group()
b=re.match(z,s2).group()
print(a,b)#效率高

match与search

这两个函数都可以通过模式匹配字符串,但是对于search与其说匹配字符不如说搜索字符串,match只能从头匹配,而search可以检索所有字符串
python之正则
当match和search没有匹配到字符串时,会返回None,所以上图match会报错,因为None没有group()方法(group()返回匹配到的字符串)

findall()

此函数是返回模式匹配到的所有字符串的列表

import re
s='I love Python hahaha LLL  !!!'
a=re.findall('l\w*',s,re.I)#re.I是忽略大小写
print(a)

返回如下:
python之正则
但是如果把a=re.findall(‘l\w*’,s,re.I)改成a=re.findall(’(l)\w*’,s,re.I),即给i加了一个小括号,运行一下,会发生什么那?
python之正则
我们发现只显示了小括号里的i,\w*为什么没起作用那?
这是因为finall函数只会匹配小括号(子组)里的模式匹配到的字符串,如果不加小括号,就默认使用全部模式匹配,即第一个例子

finditer()

finditer()跟findall()差不多,这个函数会返回一个迭代器使用方法如下:

import re
s='I love Python hahaha LLL  !!!'
a=next(re.finditer('l\w*',s,re.I)).group()#没加循环 懒得加了
print(a)
--------------------------------------------
#第二种方法
import re
s='I love Python hahaha LLL  !!!'
a=[ i.group() for i in re.finditer('l\w*',s,re.I) ]
print(a)

split()

re中的split()别str.split()强大的多,也是一个用来分割字符串的方法
可以通过max参数设定最大分割数
具体使用如下:

import re#将人名,还有年月日分开
s='Nikolas Zhaosi , 1999.12.23'
a=re.split(',|\.',s)
print(a)

返回结果:
python之正则

小结

re剩下的方法就不一一介绍了,有兴趣的可以百度,总之就是要多学多练,加油吧 少年!!!