在Python中使用正则表达式:
直接使用正则表达式
在Python中使用正则表达式需要导入re模块。
假设有一个字符串,里面有一些单词:”tip top tap tbp”,我想把里面的tip和top筛选出来,看代码实现:
import re
reg = r"t[io]p"
str = "tip top tap tbp"
re.findall(reg, str) #这时会返回一个列表,里面包含匹配到的字符串
分组与无捕获分组
import re
str1 = "I have a dog, I have a cat, I have an apple, she have a pen"
#捕获分组
reg1 = "I have a (dog|cat)"
#无捕获分组,在括号里面加上“?:”
reg2 = "I have a (?:dog|cat)"
print(re.findall(reg1, str1))
print(re.findall(reg2, str1))
运行结果:
圆括号内部是一个分组,匹配时被当做一个整体来看待。正如运行结果所示, 如果在括号中不加“?:”,程序只返回“dog”和“cat”,当加上“?:”时,就会把整个匹配到的字符串返回。
编译正则表达式
Python的re模块提供了一个正则表达式引擎的接口,可以让你将正则表达式编译成对象并用它们来进行匹配。
如果经常使用某个正则表达式,那么将正则表达式编译成对象会使匹配速度快很多。
普通编译
比如匹配电话号码的正则表达式,在程序中经常使用,那么就可以把它编译成对象来使用。
编译正则表达式:
import re #导入re模块
r1 = r"^\d{3,4}-?\d{8}$" #定义正则表达式
p_tel = re.compile(r1)#编译正则表达式
p_tel #查看正则表达式对象
p_tel.findall('010-12345678') #匹配字符串
带参数编译,实现特殊功能
忽略大小写
如果想匹配CCTV或cctv或CcTv,即忽略大小写,使用正则表达式可以这样写:
r1 = r'[Cc][Cc][Tt][Vv]' #定义正则表达式
reg = re.compile(r1) #编译正则表达式
reg.findall('CCTV') #匹配字符串,这时会匹配成功
reg.findall('cctv') #这样也会匹配成功
但是如果要匹配的字符串不是CCTV,而是abcdefghijklmnopqrstuvwxyz,采用上述方法就会很麻烦了。解决办法就是在编译的时候加上一个参数,使得正则表达式在匹配字符串的时候忽略大小写。看下面的代码:
r1 = r'abcdefghijklmnopqrstuvwxyz' #定义正则表达式
reg = re.compile(r1, re.I) #编译正则表达式,注意:加了一个参数“re.I”,是re中的一个属性
reg.findall('ABCDEFGHIJKLMNOPQRSTUVWXYZ') #匹配字符串,这时也会匹配成功
正则表达式常用函数
分割字符串
在字符串的常用函数中,有这样一个用来分割字符串的函数,用法如下:
str1 = "123+456+789+100"
list1 = str1.split("+")
print(list1)
但是当上述代码中的str1是“123+456-789*321/890”的时候,我们再想把字符串中的数字分离出来,字符串中的split函数已经无法满足要求了,这个时候我们可以用正则表达式中的split函数来进行分割代码如下:
import re
str1 = "123+234-456*789/100"
reg = r"[\-\+\*/]" #这里面的“-”、“+”、“*”在正则表达式里有特殊含义,所以要想表示他们本身,要在前面加反斜杠来转义,而除号“/”不用
reg_compile = re.compile(reg) #编译
list1 = reg_compile.split(str1) #调用split函数,该函数返回一个列表
print(list1) #打印列表
程序执行结果:
关于详细的正则表达式的用法,请参考我的另一篇博客正则表达式