Python3.6笔记之正则表达式

来源:互联网 发布:少女前线数据获取失败 编辑:程序博客网 时间:2024/04/29 21:38

在Python中使用正则表达式:

直接使用正则表达式

在Python中使用正则表达式需要导入re模块。
假设有一个字符串,里面有一些单词:”tip top tap tbp”,我想把里面的tip和top筛选出来,看代码实现:

import rereg = r"t[io]p"str = "tip top tap tbp"re.findall(reg, str)  #这时会返回一个列表,里面包含匹配到的字符串

分组与无捕获分组

import restr1 = "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 restr1 = "123+234-456*789/100"reg = r"[\-\+\*/]"  #这里面的“-”、“+”、“*”在正则表达式里有特殊含义,所以要想表示他们本身,要在前面加反斜杠来转义,而除号“/”不用reg_compile = re.compile(reg)  #编译list1 = reg_compile.split(str1) #调用split函数,该函数返回一个列表print(list1) #打印列表

程序执行结果:
这里写图片描述

关于详细的正则表达式的用法,请参考我的另一篇博客正则表达式

原创粉丝点击