11.正则表达式(二)

目录:
1.模块介绍
2.单次匹配
3.全文搜索
4.匹配替换
5.分割字符串
6.分组

1.模块介绍

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

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

2.单次匹配

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

1.match:

re.match(pattern,string,flags=0)
regex.match(string[,pos[,endpos]])
match匹配从字符串的开头匹配,regex对象match方法可以重设定开始位置和结束位置,返回match对象
import re
s = '''bottle\nbag\nbig\nable'''

# ===match===
result = re.match('b',s)  # 找到一个就不找了
print(1,result) # bottle
print(2,type(result))
result = re.match('a',s) # 没找到,返回None
print(3,result)
result = re.match('^a',s,re.M) # 依然从头开始找,多行模式没有用
print(4,result)
result = re.match('^a',s,re.S) # 依然从头开始找
print(5,result)

运行结果:
1 <_sre.SRE_Match object; span=(0, 1), match='b'>
2 <class '_sre.SRE_Match'>
3 None
4 None
5 None

# 先编译,然后使用正则表达式对象
regex = re.compile('a')
result = regex.match(s)
print(1,result)
result = regex.match(s,15)
print(2,result)

# 运行结果
1 None
2 <_sre.SRE_Match object; span=(15, 16), match='a'>

2.search:

re.search(pattern,string,flags=0)
regex.search(string[,pos[,endpos]])
从头搜索直到第一个匹配,regex对象search方法可以重设定开始位置和结束位置,返回match对象
import re
s = '''bottle\nbag\nbig\nable'''

# ===search===
result = re.search('a',s)  # 扫描找到匹配的第一个位置
print(1,result)  # apple
regex = re.compile('b')
result = regex.search(s,1)
print(2,result)  # bag
regex = re.compile('^b',re.M)
result = regex.search(s) # 不管是不是多行,找到就返回
print(3,result)  # bottle
result = regex.search(s,8)
print(4,result)  # big

# 运行结果
1 <_sre.SRE_Match object; span=(8, 9), match='a'>
2 <_sre.SRE_Match object; span=(7, 8), match='b'>
3 <_sre.SRE_Match object; span=(0, 1), match='b'>
4 <_sre.SRE_Match object; span=(11, 12), match='b'>

3.fullmatch:

re.fullmatch(pattern,string,flags=0)
regex.fullmatch(string[,pos[,endpos]])
import re

s = '''bottle\nbag\nbig\nable'''

# ===fullmatch===
result = re.fullmatch('bag',s)
print(1,result)
regex = re.compile('bag')
result = regex.fullmatch(s)
print(2,result)
result = regex.fullmatch(s,7)
print(3,result)
result = regex.fullmatch(s,7,10)  # 要完全匹配,多了少了都不行[7,10)
print(4,result) 

# 运行结果
1 None
2 None
3 None
4 <_sre.SRE_Match object; span=(7, 10), match='bag'>

3.全文搜索

1.findall:

re.findall(pattern,string,flags=0)
regex.findall(string[,pos[,endpos]])
对整个字符串,从左至右匹配,返回所有匹配项的列表
import re

s = '''bottle\nbag\nbig\nable'''

# ===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)
regex = re.compile('^b',re.S)
result = regex.findall(s)
print(4,result)
regex = re.compile('^b',re.M)
result = regex.findall(s,7,10)
print(5,result)

# 运行结果
1 ['b', 'b', 'b', 'b']
2 ['b']
3 ['b', 'b']
4 ['b']
5 ['b']

2.finditer:

re.finditer(pattern,string,flags=0)
regex.finditer(string[,pos[,endpos]])
对整个字符串,从左至右匹配,返回所有匹配项,返回迭代器。
注意:每次迭代返回的是match对象
import re

s = '''bottle\nbag\nbig\nable'''

# ===finditer方法===
regex = re.compile('^b',re.M)
result = regex.finditer(s)
print(0,type(result))

for i,x in enumerate(result,1):  # enumerate用法,遍历时,前面元素位索引,后面位迭代的值
    print(i,x)

# 运行结果
0 <class 'callable_iterator'>
1 <_sre.SRE_Match object; span=(0, 1), match='b'>
2 <_sre.SRE_Match object; span=(7, 8), match='b'>
3 <_sre.SRE_Match object; span=(11, 12), match='b'>

4.匹配替换

1.sub:

re.sub(pattern,replacement,string,count=0,flags=0)
regex.sub(replacement,string,count=0)
使用pattern对字符串string进行匹配,对匹配项使用repl替换。
replacement可以是string、bytes、function

2.subn:

re.subn(pattern,replacement,string,count=0,flags=0)
regex.subn(replacement,string,count=0)
同sub返回一个元组(new_string , number_of_subs_made)
import re

s = '''bottle\nbag\nbig\nable'''

# ===sub方法===
regex = re.compile('b\wg')
result = regex.sub('stone',s)
print(1,result.replace('\n',','))  # 被替换后的字符串
result = regex.sub('stone',s,1)  # 替换1次
print(2,result.replace('\n',','))

# ===subn方法===
regex = re.compile('\s+')
result = regex.subn('\t',s)
print(3,result)

# 运行结果
1 bottle,stone,stone,able
2 bottle,stone,big,able
3 ('bottle\tbag\tbig\table', 3)

5.分割字符串

1.split:

字符串的分割函数,太难用,不能指定多个字符进行分割
re.split(pattern,string,maxsplit=0,flags=0)
re.split分割字符串
import re

s = '''01 bottle
02 bag
03       big1
100         able'''

# ===split方法,把每行单词提取出来===
print(0,s.split())
result = re.split('[\s\d]+',s)
print(1,result)

regex = re.compile('^[\s\d]+')
result = regex.split(s)
print(2,result)

regex = regex.split(s)
print(3,result)

regex = re.compile('\s+|(?<!\w)\d+')
result = regex.split(s)
print(4,result)

regex = re.compile('\s+\d+\s+')
result = regex.split(' ' + s)
print(5,result)

# 运行结果
0 ['01', 'bottle', '02', 'bag', '03', 'big1', '100', 'able']
1 ['', 'bottle', 'bag', 'big', 'able']
2 ['', 'bottle\n02 bag\n03       big1\n100         able']
3 ['', 'bottle\n02 bag\n03       big1\n100         able']
4 ['', '', '', 'bottle', '', '', 'bag', '', '', 'big1', '', '', 'able']
5 ['', 'bottle', 'bag', 'big1', 'able']

6.分组

使用小括号的pattern捕获的数据被放到了组group中。match、search函数可以返回match对象;findall返回字符串列表;finditer返回一个个match对象
如果pattern中使用了分组,如果有匹配的结果,会在match对象中
1.使用group(N)方式返回对应分组,1-N是对应的分组,0返回整个匹配的字符串
2.如果使用了命名分组,可以使用group('name')的方式取分组
3.也可以使用groups()返回所有组
4.使用groupdict()返回所有命名的分组
import re

s = '''bottle\nbag\nbig\napple'''

# 分组
regex = re.compile('(b\w+)')
result = regex.match(s)
print(0,type(result))
print(1,'match',result.groups())

result = regex.search(s,1)
print(2,'search',result.groups())

# 命名分组
regex = re.compile('(b\w+)\n(?P<name2>b\w+)\n(?P<name3>b\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())
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('(?P<head>b\w+)')
result = regex.finditer(s)
for x in result:
    print('==',type(x),x,x.group(),x.group('head'))

# 运行结果
0 <class '_sre.SRE_Match'>
1 match ('bottle',)
2 search ('bag',)
3 match <_sre.SRE_Match object; span=(0, 14), match='bottle\nbag\nbig'>
4 big bag bottle
5 b'bottle\nbag\nbig'
6 bag big
7 ('bottle', 'bag', 'big')
8 {'name2': 'bag', 'name3': 'big'}
** <class 'tuple'> ('bottle', 'bag', 'big')
== <class '_sre.SRE_Match'> <_sre.SRE_Match object; span=(0, 6), match='bottle'> bottle bottle
== <class '_sre.SRE_Match'> <_sre.SRE_Match object; span=(7, 10), match='bag'> bag bag
== <class '_sre.SRE_Match'> <_sre.SRE_Match object; span=(11, 14), match='big'> big big
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容