python正则表达式
admin
2023-07-20 09:02:25
0

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

常量

常量                                     说明
re.M、re.MULTILINE          多行模式  
re.S、re.DOTALL                单行模式
re.I、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对象
re.search(pattern,string,flags=0)
regex.search(string[,pos[,endpos]])
从头搜索直到第一个匹配,regex对象search方法可以重新设定开始和结束位置,返回match对象
re.fullmatch(pattern,string,flags=0)
regex.fullmatc(string[,pos[,endpos]])
整个字符串和正则表达式匹配

import re 
s = '''bottle\nbag\nbig\napple'''
for i,c in enumerate(s,1):
        print((i-1,c),end = '\n' if i%8==0 else ' ')
print()

(0, 'b') (1, 'o') (2, 't') (3, 't') (4, 'l') (5, 'e') (6, '\n') (7, 'b')
(8, 'a') (9, 'g') (10, '\n') (11, 'b') (12, 'i') (13, 'g') (14, '\n') (15, 'a')
(16, 'p') (17, 'p') (18, 'l') (19, 'e') 
#match 方法
print('--match--')
result = re.match('b',s) # 找到一个就不找了
print(1,result)
result = re.match('a',s)
print(2,result) #没找到返回None
result = re.match('^a',s,re.M)# 依然从头开始找,多行模式没有用
print(3,result)
result = re.match('^a',s,re.S)#依然从头开始找
print(4,result)
#先编译,再使用正则表达式表达
regex = re.compile('a')
result = regex.match(s) #依然从头开始找
print(5,result)
result = regex.match(s,15)  # 把索引15作为开始找
print(6,result)
print()

search方法
print('--search--')
result = re.search('a',s) # 扫描找到匹配的第一个位置
print(7,result)
regex = re.compile('b')
result = regex.search(s,1)
print(8,result) # bag
regex = re.compile('^b',re.M)
result = regex.search(s) # 不管是不是多行,找到就返回
print(8.5,result) #bootle
result = regex.search(s,8)
print(9,result) #big

fullmatch方法
result = re.fullmatch('bag',s)
print(10,result)
regex = re.compile('bag')
result = regex.fullmatch(s)
print(11,result)
result = regex.fullmatch(s,7)
print(12,result)
result = regex.fullmatch(s,7,10)
print(13,result) # 要完全匹配,多了少了都不行,[7,10)
全文方法
re.findall(pattern,string,flags=0)
regex.findall(string[,pos[,endpos]])
对整个字符串,从左至右匹配,返回所有匹配项的列表
re.finditer(pattern,string,flags=0)
regex.fingiter(string[,pos[,endpos]])
对整个字符串,从左至右匹配,返回所有匹配项,返回迭代器
注意每次迭代返回的是match对象。
import re 
s = '''bottle\nbag\nbig\nable'''
for i,c in enumerate(s,1):
        print((i-1,c),end = '\n' if i%8==0 else ' ')
print()

(0, 'b') (1, 'o') (2, 't') (3, 't') (4, 'l') (5, 'e') (6, '\n') (7, 'b')
(8, 'a') (9, 'g') (10, '\n') (11, 'b') (12, 'i') (13, 'g') (14, '\n') (15, 'a')
(16, 'b') (17, 'l') (18, 'e') 
findall 方法
result = re.findall('b,',s)
print(1,result)
regex = re.compile('^b')
result = regex.findall(s)
print(2,result)
regex = re.compile('^b',re.M)
result = regex.findall(s,7)
print(3,result) #bag big
regex = re.compile('^b',re.S)
result = regex.findall(s)
print(4,result) # bottle
regex = re.compile('^b',re.M)
result = regex.findall(s,7,10)
print(5,result)  # bag
fiditer 方法
result = regex.finditer(s)
print(type(result))
print(next(result))
print(next(result))

匹配替换

re.sub(pattern,replacement,string,count=0,flags=0)
regex.sub(replacement,string,count=0)
使用pattern对字符串string进行匹配,对匹配项使用repl替换。
replacement可以是string、bytes、function
re.subn(pattern,replace,string,count=0,flags=0)
regex.subn(replance,string,string,count=0)
同sub返回一个元组(new_string,number_of_subs_made)
import re 
s = '''bottle\nbag\nbig\napple'''
for i,c in enumerate(s,1):
        print((i-1,c),end = '\n' if i%8==0 else ' ')
print()

(0, 'b') (1, 'o') (2, 't') (3, 't') (4, 'l') (5, 'e') (6, '\n') (7, 'b')
(8, 'a') (9, 'g') (10, '\n') (11, 'b') (12, 'i') (13, 'g') (14, '\n') (15, 'a')
(16, 'p') (17, 'p') (18, 'l') (19, 'e') 

替换方法
regex = re.compile('b\wg')
result = regex.sub('magedu',s)
print(1,result)
result = regex.sub('magedu',s,1)
print(2,result)

regex = re.compile('\s+')
result = regex.subn('\t',s)
print(3,result)  # 被替换后的字符串及替换次数的元组
分割字符串
re.split(pattren,string,maxsplit,flags=0)
re.split(分割字符串)
import re
s = '''01 bottle
02 bag
03    big1
100    able'''
for i,c in enumerate(s,1):
        print((i-1,c),end='\n' if i%8==0 else ' ')
print()
把每行单词提取出来
print(s.split())  #做不到['01'...'big1'...]
result = re.split('[\s\d]+',s)
print(1,result)
regex = re.compile('^[\s\d]+')
result = regex.split(s)
print(2,result)
regex = re.compile('^[\s\d]+',re.M)
result = regex.split(s)
print(3,result)
regex = re.compile('\s\d+\s+')
result = regex.split(' '+s)
print(4,result)

分组

使用小括号的pattern捕获的数据被放到了组group中。
match、search函数可以返回match对象,findall返回字符串列表,finditer返回一个match对象
如果pattern中使用了分组,如果匹配有结果,会在match对象中
1、使用group(N)方式返回对应分组,1到N是对应分组,0返回整个匹配字符
2、如果使用了命名分组,可以使用group('name')的方式取分组
3、使用groupdict()返回所有命名的分组
import re 
s = '''bottle\nbag\nbig\napple'''
for i,c in enumerate(s,1):
        print((i-1,c),end = '\n' if i%8==0 else ' ')
print()

#分组
regex = re.compile('(b\w+)')
result = regex.match(s)
print(type(result))
print(1,'match',result.groups())
result = regex.search(s,8)
print(2,'match',result.groups())
#命名分组
regex = re.compile('(b\w+)\n(?Pb\w+)\n(?Pb\w+)')
result = regex.match(s)
print(3,'match',result)
print(4,result.group(3),result.group(2),result.group(1))
print(5,result.group(0).encode()) # 0返回整个匹配字符串,即match
print(6,result.group('name2'),result.group('name3'))
print(7,result.groups())
print(8,result.groupdict())

result = regex.findall(s)
for x in result:  # 字符串列表
        print(type(x),x)

regex = re.compile('(?Pb\w+)')
result = regex.finditer(s)
for x in result:
        print(type(x),x,x.group(),x.group('head'))

相关内容

热门资讯

临时改由美伊总统签协议,伊朗发... 据凤凰卫视援引伊朗国家电视台报道,6月18日,伊朗外交部发言人巴加埃表示,双方原计划在瑞士举行正式签...
年度第一爽剧,暴露了东亚人的“... 作者/刘三金 编辑/闫如意爽剧还是太超前了。继各路大女主、大男主之后,爽剧界又开辟出一个新赛道——专...
内容标识制度:给生成式人工智能... “十五五”规划纲要提出,“完善人工智能领域法律法规、政策制度、应用规范、伦理准则”。今年的全国人大常...
南京发布学前教育智能体“宁小智... 中国教育报-中国教育新闻网讯(记者 阿妮尔 通讯员 杨潇)近日,南京市电化教育馆发布南京市学前教育智...
艾能聚获得实用新型专利授权:“... 证券之星消息,根据天眼查APP数据显示艾能聚(920770)新获得一项实用新型专利授权,专利名为“一...
从“制造出海”到“数智出海” ... 6月16日,江苏跨境电商提质发展全省行活动(无锡站)暨2026长三角跨境电商交易会在无锡国际会议中心...
时至今日,经过3次断裂的中国足... 【导读】2025年美加墨世界杯正如火如荼地进行着。其中,同为中国一衣带水的邻国的日韩表现出色。韩国逆...
欧盟27国领导人一致通过涉乌结... 当地时间6月18日,欧洲理事会发布欧盟峰会关于乌克兰问题的结论文件。文件显示,欧盟27国领导人当天一...
取消、推迟!美伊谈判再生变数 当地时间6月18日晚,据美国有线电视新闻网(CNN)报道,白宫方面表示,由于下一阶段谈判的后勤安排尚...
男厨师光膀子救卡喉女顾客被质疑... 6月14日,江苏苏州一家烤鱼店内,一名女顾客用餐时突然发生异物卡喉。同行友人和店员立刻采用海姆立克急...