2018-09-11 day17-正则表达式

正则表达式

python关于正则的支持
  • 提供内置模块re
  • fullmatch(正则表达式, 字符串) - 判断字符串是否正则表达式的规则
具体内容
表示方法 解析
.(点) 匹配任意一个字符
\w 匹配一个字母a-zA-Z、数字0-9或下划线_
\s 匹配一个空白字符(空格、制表符\t、换行符\r和回车\n)
\d 匹配一个数字字符0-9
\b 检测是否是单词边界(单词的开始、结尾、单词和单词之间的字符、空白)
^ 检测字符串是否以指定的正则表达式开头
$ 检测字符串是否以指定的正则表达式结束
\W 匹配一个非字母、数字或下划线的字符
\S 匹配一个非空白字符
\D 匹配一个非数字字符
\B 检测一个非单词边界
匹配次数 解析**
[] 匹配括号中出现的任意字符,一个中括号中匹配一个字符
-(负号) 在正则表达式的中括号里应用,两边的字符是对应的unicode码(含ASCII码)对应的字符
[^字符集] 匹配不再[]中出现的任意一个字符
* 可以匹配0次或多次字符(其前面的字符)
+ 可以匹配1次或多次字符(前面)
? 可以匹配0次或1次
{N} 匹配N次字符
{N,} 最少匹配N次
{,N} 最多匹配N次
{M,N} 可匹配最少M次,最多N次
注意 次数相关的操作,都是约束次数符号的前一个的字符

分支和分组

  • | 分支(相当于逻辑运算的or)
a3str = r'[a-zA-Z]{3}|\d{3}' #三个字母或数字
print(fullmatch(a3str,'123'))
print(fullmatch(a3str,'abc'))
a3str = r'\d{3}[a-z]{3}|[A-Z]{6}' #|左右分成两部分,即123abc或ASDQWE均成立
# 含分支操作时,只要有一个符合条件就不再使用后续的其他条件
a4str = 'abc12.5hhh60,30.2kkk9nn0.12'
print(findall('\d+[.]\d+|[1-9]\d+',a4str))

result;
<_sre.SRE_Match object; span=(0, 3), match='123'>
<_sre.SRE_Match object; span=(0, 3), match='abc'>
['12.5', '60', '30.2', '0.12']

  • 分组

1.通过()对正则表达式进行分组操作

a4str = r'([a-z]{2}\d{2}){3}' #两个字母两个数字连续出现3次
print(fullmatch(a4str,'ad13ad12as32'))

result:
<_sre.SRE_Match object; span=(0, 12), match='ad13ad12as32'>

2.重复,可以通过 \数字 来重复一次前面括号中匹配的结果,数字的值代表前面的第几个分组

a4str = r'(\d{2}[a-z])(\d{3})\1'
print(fullmatch(a4str,'12q55512q'))

result:
<_sre.SRE_Match object; span=(0, 9), match='12q55512q'>

3.捕获,按照完整的正则表达式去匹配,去捕获()中的内容。只有在findall中有效

a4str = r'a(\d{3})b'
print(findall(a4str,'da124bob341a'))

result:
['124']

正则表达式的转义

  • 正则表达式的转义和字符串的转义没有任何关系,在Python中字符串前加r阻止的是字符串的转义,不能阻止正则表达式的转义
  • 在正则表达式中,可以通过在有特殊意义的符号前加\来表示符号本身
如: \+ \- \. \* \? \\(\本身) \( \) \^ \$ \|

注意: 
a. - 只有在中括号里的两个字符之间才有特殊的意义
b. 如果特殊符号放到[]作为字符集的内容,那么除了-在两个字符间以外其他不需要转义
c. \ 不管放在何处都需要转义, ^放在中括号里的最前面需要转义(转义后就是单纯的字符)
  • 例子
a2tr = r'[abc\\]{3}'
print(fullmatch(a2tr,'\\ac'))
print(fullmatch(a2tr,r'\ac'))

result:(\\ 与 前r效果一样)
<_sre.SRE_Match object; span=(0, 3), match='\\ac'>
<_sre.SRE_Match object; span=(0, 3), match='\\ac'>

re 模块

  • compile(正则表达式) - 将正则表达式转换成正则表达式对象
re_str = r'\d+'
re_object = re.compile(re_str)
print(re_object,type(re_object))

# 不转换成正则表达式对象,调用函数
re.fullmatch(re_str,'123asd')
# 转换成正则表达式,调用函数
re_object.fullmatch('123asd')

result:
re.compile('\\d+') <class '_sre.SRE_Pattern'>
  • match(正则表达式, 字符串)--只判断字符串的开头是否能够和正则表达式匹配
  • fullmatch(正则表达式, 字符串)--判断整个字符串是否能够和正则表达式匹配
# 返回值都是匹配结果,如果匹配成功返回匹配对象,否则返回None


re_str = r'abc\d{3}'
match = re.match(re_str,'abc123456')
match2 = re.fullmatch(re_str,'abc123')
# a.匹配到的范围。匹配结果字符单位下标范围
print(match.span(),match2.span())
#获取起点和终点
print(match.start(),match.end())
# 正则表达式有分组时,span()函数中的group参数指定特定分组相应的结果
re_str = r'(\d{3})\+([a-z]{3})'
match1 = re.match(re_str,'123+qwe001')
print(match1,match1.span(),match1.span(1),match1.span(2))
# b.获取匹配结果对应的字符串
print(match1.group(),match1.group(1),match1.group(2))

# c.获取被匹配的原字符串
print(match1.string)

result:
(0, 6) (0, 6)
0 6
<_sre.SRE_Match object; span=(0, 7), match='123+qwe'> (0, 7) (0, 3) (4, 7)
123+qwe 123 qwe
123+qwe001
  • search(正则表达式, 字符串)-在字符串中查找第一个满足正则表达式的子串,若找到返回匹配对象,否则返回None
search1 = re.search(r'\d+Zz','hello my son,5Zz')
print(search1)

result:
<_sre.SRE_Match object; span=(13, 16), match='5Zz'>
  • split(正则表达式, 字符串) - 按满足正则表达式的子串去切割字符串,返回列表
str2 = '锄禾日当午,汗滴禾下土。谁知盘中餐,粒粒皆辛苦。'
result = re.split(r'[,,。.]',str2)
result2 = re.split(r'\W',str2)
print(result[:-1])
print(result2)#中文的输入也在\w以内

result:
['锄禾日当午', '汗滴禾下土', '谁知盘中餐', '粒粒皆辛苦']
['锄禾日当午', '汗滴禾下土', '谁知盘中餐', '粒粒皆辛苦', '']
  • sub(正则表达式,替换字符串,被替换的字符串)
word = '你丫是傻逼吗?我操死你大爷。挂机死全家'
result3 = re.sub(r'傻逼|操|死|挂机','?',word)
print(result3)

result:
你丫是?吗?我??你大爷。??全家
  • findall(正则表达式, 字符串) - 获取字符串中所有满足正则表达式的子串,返回值是列表。注意: 分组中的捕获效果在findall中有效
result4 = re.findall(r'\d([a-z]+)','对滴2abc光明0iop')
print(result4)

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

推荐阅读更多精彩内容

  • 正则表达式 正则表达式就是用来检测字符串是否满足某种规则的工具例如:匹配手机号、邮箱、脏话检测等 1、单字符 py...
    Deathfeeling阅读 308评论 2 1
  • 正则表达式就是用来检测字符串是否满足某种规则的工具例如:1.账号是手机号/邮箱/多少位由什么东西组成等...2.脏...
    oxd001阅读 362评论 0 0
  • Python中的正则表达式(re) import rere.match #从开始位置开始匹配,如果开头没有则无re...
    BigJeffWang阅读 7,050评论 0 99
  • python的re模块--细说正则表达式 可能是东半球最详细最全面的re教程,翻译自官方文档,因为官方文档写的是真...
    立而人阅读 22,831评论 4 46
  • 1.正则表达式 正则表达式就是用来检测字符串是否满足某种规则的工具例如:1.账号是手机号/邮箱/多少位由什么组成等...
    xaidc阅读 127评论 0 0