python中的re模块

Python的正则表达式

python使用re模块提供了正则表达式处理的能力

常量
常量说明
re.M或re.MULTILINE多行模式
re.S或re,DOTALL单行模式
re.l或re.IGNORECASE忽略大小写
re.X或re,VERBOSE忽略表达式中的空白字符
使用位或开启多种选项
方法

编译

re.compile(pattern,flags=0)

设定flags,编译模式,返回正则表达式对象regex。
pattern就是正则表达式字符串,flags是选项,正则表达式需要被编译,为了提高效率,这些编译后的结果被保存,下次使用同样的pattern的时候,就不需要再次编译
re的其它方法为了提高效率都调用了编译方法,就是为了提速。
单词编译

re,match(pattern,string,flags=0)
regex.,match(string[,pos[,endpos]])
  • match匹配从字符串的开头匹配,regex对象match方法可以重设开始和结束位置,返回match对象,match只查看第一个开头
import re
b="""bottle\nbag\nbig\napple"""
for i ,c in enumerate(b,1):
    print((i-1,c),end='\n'if i%10==0 else ' ')
r=re.match('b',b) #在字符串b中搜索开头是‘b’
print(1,r,type(r))#只返回开头的‘b’
r=re.match('a',b,re.M)#在多行模式中使用
print(2,r,type(r))#依旧是在开头找,只找寻一次
r=re.match('a',b,re.S)#在开头找,只找寻一次
print(3,r,type(r))

都是在找开头的’b’

在这里插入图片描述

#先编译,然后使用正则表达式对象
regex=re.compile('b')  #编译
result=regex.match(b)  #未指定位置从头开始寻找
print(result)
#可以限制范围,但是由于是找到第一个就停止寻找了,限制范围并没有什么用处
result=regex.match(b,7,11)
print(result)

在这里插入图片描述

  • 从头搜索知道第一个匹配,regex对象search方法可以重新设定开始位置和结束位置,返回match对象
re.search(pattern,string,flags=0)
regex,search(string[,pos[,endpos]])
#search方法
result=re.search('\n',b)
print(result)
regex=re.compile('^\w')
result=regex.search(b)
print(result)

在这里插入图片描述

  • 整个字符串和正则表达式匹配
re.fullmatch(pattern,string,flags=0)
regex.fullmatch(string[,pos,[,endpos]])
# fullmatch
result=re.fullmatch('bag',b)
print(result)#无法找到需要指定索引
regex=re.compile('bag')
result=regex.fullmatch(b)
print(result)#无法找到需要指定索引
result=regex.fullmatch(b,7,10)#需要完全匹配,多了少了都不行
print(result)

在这里插入图片描述

全文搜索
  • 对于整个字符串,从左到右匹配,返回所有匹配项的列表,findall直接拿到match部分
re.findall(pattern,string,flags=0)
regex.findall(string[,pos[,endpos]])
#findall方法
result=re.findall('b',b)
print(result)
regex=re.compile('a')
result=regex.findall(b)
print(result)

在这里插入图片描述

  • 对整个字符串,从左到右匹配,返回所有匹配项,返回迭代器,注意每次迭代器返回的是match对象
#finditer方法
r=re.finditer('b\w',b)
print(type(r),r)
for x in r:
    print(type(x),x,x.start(),x.end(),b[x.start():x.end()])

在这里插入图片描述

匹配替换

使用pattern对字符串string进行匹配,对匹配项使用repl替换,replacement可以是string、bytes、function。

re.sub(pattern,replacement,string,count=0,flags=0)
regex.sub(replacement,string,count=0)
re.subn(pattern,replacement,string,count=0,flags=0)
regex.subn(replacement,string,count=0)

同sub返回一个元组(new_string,number_of_subs_made)

import re
b="""bottle\nbag\nbig\napple"""
for i ,c in enumerate(b,1):
    print((i-1,c),end='\n'if i%10==0 else ' ')
#替换方法
regex=re.compile('b\wg')
result=regex.sub('miaomiao',b,1)
result1=regex.sub('miaomiao',b)
print(result,result1)
regex=re.compile('\s+')
result=regex.subn('\t',b,1)#能选择替换几次
print(result)#显示替换了几次

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分割字符串

字符串的分割函数split,太难用了,不能指定多个字符进行分割

re.split(pattern,string,maxsplit=0,flags=0)
import re
s="""
os.path.abspath(path)
normpath(join(os.getcwd(),path)).
print(re.split('\W+',s))
"""

在这里插入图片描述

分组

使用小括号的pattern捕获的数据被放到了 组group中
match、search函数可以返回match对象;findall返回字符串列表;finditer返回一个个match对象
如果pattern中使用了分组,如果有匹配的结果,会在match对象中

  • 使用group(N)方式返回对应分组,1到N是对应的分组,0返回整个匹配的字符串,N不写缺省为0
  • 如果使用了命名分组,可以使用group(‘name’)的方式取分组
  • 也可以使用groups()返回所有组
  • 使用groupdict()返回所有命名的分组
import re
b='''bottle\nbag\nbig\napple'''
r=re.match('(b)(\w+)',b)
t=re.match('b(\w)+',b)
n=re.match('(?P<header>b)(?P<tail>\w+)',b) #命名分组
print(t) #显示的不一定是正确的
print(type(r),r)
print(r.groups())#显示组们
print(r.group(1),r.group(2),r.group())
print(n.group('header'),n.group(2),n.group()) #使用group(name)也可以查询
print(n.groupdict().items())
print(n.groupdict()['header'],n.groupdict()['tail'])

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值