Python之正则表达式

目录

1、 正则表达式基本使用,元字符,预定义字符

2、 python的正则表达式re模块



为了方便讲解,首先讲一下re模块最简单的用法

import re  #内置模块
 #编译,就是我们要匹配的规则,这里之所以要编译一下,是因为python内部的优化,如果后面多次使用这个规则,效率则会提升
pattern = re.compile('sun') 
#match方法:从头匹配
#str = "sun111"
str = "111sun"
match = pattern.match(str)
#这里也就是说这里
#当str是sun111时,控制台就输出sun,表示匹配成功
#当str是111sun时,控制台就输出None,表示匹配失败
if match:
    print(match.group())
else:
    print(match)

一、 正则表达式基本使用,元字符,预定义字符

1.1、元字符

元字符 含义 用法
点号: . 可以匹配任意字符(\n除外)
re.match('sun.', 'sunA') #匹配成功

re.match('sun.', 'sun@') #匹配成功

re.match('sun.', 'sun5') #匹配成功

re.match('sun.', 'sun\n') #匹配失败

星号: * 可以匹配某字符0次、1次、n次
print(re.findall("qwer*", 'qwe'))#匹配r 0 次成功

print(re.findall("qwer*", 'qwer'))#匹配r 1 次成功

print(re.findall("qwer*", 'qwerrrrr'))#匹配r n 次成功

加号: + 可以匹配某字符1次、n次
print(re.findall("qwer+", 'qwe'))#匹配r 0 次失败功

print(re.findall("qwer+", 'qwer'))#匹配r 1 次成功

print(re.findall("qwer+", 'qwerrrrr'))#匹配r n 次成功

问号:? 某字符要么没有(0次),要么只有1次
print(re.findall("sun?w", 'fsunw'))#匹配成功

print(re.findall("sun?w", 'fsuw'))#匹配成功

print(re.findall("sun?w", 'fsunnw')) #匹配失败

上括号: ^ 匹配开头
re.findall("^sun", 'sun11111'))#匹配成功(sun)

re.findall("^sun", '11sun111') #匹配失败

美元符: $ 匹配结尾
re.findall("sun$", '11111sun')#匹配成功(sun)

re.findall("sun$", 'sun11111') #匹配失败

或符号: | 或者条件
re.findall("sun|qi", 'sun11')#匹配成功

re.findall("sun|qi", '11qi')#匹配成功

re.findall("sun|qi", 'sun11qi')#匹配成功

re.findall("sun|qi", 'aaaaa') #匹配失败

花括号: {} {3}:匹配前一个字符3次

{1,3}:匹配前一个字符1到3次

{3,}:匹配前一个字符3次以上

re.findall("a{1}b{2}c{3}", 'abbccc')#匹配成功

print(re.findall("a{4,}", 'aaa')#匹配失败

re.findall("a{4,}", 'aaaa')#匹配成功

中括号: [] 字符集

[abc]{2}:只要字符满足在中括号中存在,就保留,匹配两次

匹配:re.findall("[abc]{2}", 'abebccc')

结果:['ab', 'bc', 'cc']

分析:首先匹配a,在字符集[]中,保留,
再匹配一次,开始匹配b,满足条件,
这时得到第一个结果ab。
然后开始匹配e,不满足条件,
开始匹配b....以此类推

小括号: () 分组
匹配:re.match("(sun){1}([abc]{2})", 'sunaaa').groups()

结果:('sun', 'aa')

1.2、预定义字符

预定义字符 含义
\d
0-9

\D
非数字

\s
匹配任意空白字符

空白字符包括空格、\n、\t、\v、\f、\r

\S
非空白字符

\w
[ a-z, A-Z, 0-9,_ ]

\W
与\w相反的字符,比如#@之类的,不包括汉字

\A
匹配开头,与 ^ 相似

\Z
匹配结尾,与 $ 相似

\b
边界字符

\B
非边界字符

二、python的正则表达式re模块

2.1、match方法

一个参数

就是从头开始匹配

pattern = re.compile('sun')
result = pattern.match('sunqiyong')
if result:
    print(result.group())
#输出结果:sun

compile 第二个参数

可以改变匹配规则

pattern = re.compile('sun.')
result = pattern.match('sun\n')
if result:
    print(result.group())
#没有输出结果

pattern = re.compile('sun.',re.S)
result = pattern.match('sun\n')
if result:
    print(result.group())
#输出结果:sun
#总结,就是加入参数re.S,就可以让点号不受\n的影响

2.2、search 方法

相比较于match函数,都是从开头开始匹配,是不过search方法是如果开头匹配不上,会继续向后匹配

p = re.compile('cici')
match = p.search('123cicijjfcicioi')
if match:
    print(match.group()) #输出结果:cici
    print(match.start()) #输出结果:3 角标3
    print(match.end()) #输出结果:7 角标7
    print(match.span()) #输出结果:(3, 7)  匹配结果角标区间,包左不包右

2.3、分组 信息

p = re.compile('([a-z]{3})([a-z]{2})([0-9]{2})([A-Z]{2})')
match = p.search('sunci55PY')
if match:
    print(match.groups()) #输出结果('sun', 'ci', '55', 'PY')

2.4、findall方法

p = re.compile('\d{2}')
match = p.findall('sunci55PY23')
print(match)#输出结果  ['55', '23']

2.5、finditer方法

和findal比较相似,匹配之后返回的对象是--->迭代器

p = re.compile('\d{2}')
match = p.finditer('benci55PY23')
for item in match:
    print(item.group())
#输出结果  55  23

2.6、sub方法 主要是替换的功能

p = re.compile('\d+')
#参数一   新的内容,要替换成的内容
#参数二   旧的内容,要被替换的内容
#参数三   替换的次数
match = p.sub('www','aaa5555aa33aa222aaa',2)
print(match)#输出结果  aaawwwaawwwaa222aaa

2.7、subn方法 主要是替换的功能

str = 'aaa5555aa33aa222aaa'
#参数一   匹配规则
#参数二   新的内容,要替换成的内容
#参数三   旧的内容,要被替换的内容
match = re.subn('\d+', 'qq', str)
print(match)# 输出结果 ('aaaqqaaqqaaqqaaa', 3)

2.8、aplit方法 字符串切割

pattern = re.compile(':')#用 : 切割字符串
result = pattern.split('2017:12:12 09:21:45')
print(result)#输出结果 ['2017', '12', '12 09', '21', '45']

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

推荐阅读更多精彩内容