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

正则表达式就是用来检测字符串是否满足某种规则的工具
例如:1.账号是手机号/邮箱/多少位由什么东西组成等...
2.脏话替换

1.正则语法

2.python对正则表达式的支持,提供了一个内置模块:re

from re import fullmatch
fullmatch(正则表达式,字符串):判断整个字符串是否符合前面正则表达式的规则
1.正则表达式里面的语法

符号 解释 例子
. 匹配任意一个字符 b.t
\w 匹配字母数字下划线 b\w
\s 匹配空白字符 abc\s
\d 匹配一个数字字符 abc\d
\b 检测是否是单词边界 abc\b,123
^ 检测一个字符串是否以正则表达是开头
$ 检测字符串是否以给定的正则表达式结尾
\W 匹配非数字、字母、下划线
\S 匹配非空白字符
\D 匹配非数字字符
\B 检测非单词边界
[] 匹配中括号中出现的任意字符,一个中括号只匹配一个字符
[a-z][1-8] 匹配a到z中或者1到8中的一个字符
[^a-z] 匹配不在字符集中的任意一个字符

3.re模块的方法

1.re.compile(正则表达式):将正则表达式转换成正则表达式对象,可以用来检测正则表达式是否错误

re_str ='\d+'
re_object = re.compile(re_str)
print(re_obect)
re_object.fullmatch('78')   #转换成对象调用对应的方法
re.fullmatch(re_str,'78') #不转换成对象调用相应的方法

2.match(正则表达式,字符串):match判断字符串开头是否能够和正则表达式匹配,返回值是匹配结果

如果匹配成功返回匹配对象,否则返回None

re_str = r'abc\d{3}'
match1 = re.match(re_str,'abc123abc')

fullmatch(正则表达式,字符串):是判断整个字符串是否能够和正则表达式匹配,返回值是匹配结果
如果匹配成功返回匹配对象,否则返回None

a.匹配到的范围。匹配结果字符的下标范围:[起始下标:结束下标]----结束下标取不到

span(self,group)
start(self,group)
end(self,group)
re_str = r'abc\d{3}'
match1 = re.match(re_str,'abc123abc')
print(match1.span())    #获取下标的范围
print(match1.start())   #获取起点
print(match1.end())     #获取终点

注意:group参数是用来指定分组对应的相应的结果

re_str = r'(\d{3})\+([a-z]{2})'
match1 = re.match(re_str,'234+gj')
print(match1.span())    #(0,6)
print(match1.span(1))   #(0,3)
print(match1.span(2))   #(4,6)

print(match1.start(2))  #在匹配结果中获取第二个分组的起始下标
b.
print(match1.group())   #获取匹配结果对应的字符串
print(match1.group(1))  #获取匹配结果第一个分组对应的字符串
c.
print(match1.string) #获取被匹配的原字符串

3.search(正则表达式,字符串):在字符串中去查找第一个满足正则表达式要求的子串,如果找到了就返回匹配对象,找不到返回None

re_str = r'\d{3}'
match1 = re.search(re_str,'ab123b345')
print(match1.span())    #(2,5)

练习:使用search将一个字符串中所有的数字字符串全部找到
'工资是10000元,年龄是18岁,身高是:180,颜值是100分'

import re
re_str = r'[1-9]\d*'
str_1='工资是10000元,年龄是18岁,身高是:180,颜值是100分'
match1 = re.search(re_str,str_1)
while match1:
    end = match1.end()
    print(match1.group())
    str_1 = str_1[end:]
    match1 = re.search(re_str,str_1)

4.split(正则表达式,字符串)

按满足正则表达式的子串去切割字符串,返回值是列表,中文属于\w

str1 = 'ni,hao。hello,world'
re_str= r'[,。!!,]'
print(re.split(re_str,str1))

5.sub(正则表达式,替换字符串,被替换的字符串),返回值是先的字符串

word = '你丫是傻叉吗,我操你大写的,Fuck you'
re_str = r'傻叉|操|Fuck|'
new_word = re.sub(re_str,'*',word)
print(new_word)

6.findall(正则表达式,字符串)

获取字符串中所有满足正则表达式的子串
返回值是列表
注意:分组里的捕获在findall里是有效的

result = re.findall(r'\d([a-z]+)','anannHHDXN试试NNm')

4.正则表达式匹配验证

# 1).匹配任意字符
from re import fullmatch,search,findall

#匹配一个字符串,只有三位字符并且其中一个字符是任意字符
re_str = r'b.t'
result = fullmatch(re_str,'bat')
print(result)

#匹配一个字符串,只有两位位字符并且这两个字符是任意字符
re_str = r'..'
result = fullmatch(re_str,'ba')
print(result)

#匹配一个字符串,前三位分别是abc,最后一位是任意字符
re_str = r'abc.'
result = fullmatch(re_str,'abcl')
print(result)

# 2) \w匹配字母数字下划线(包括汉字)
#匹配一个字符串,前一位是a,后一位是字母数字下划线 
re_str = r'a\w'
result = fullmatch(re_str,'a含')
print(result)

# 3) \s匹配空白字符(空白指的是空格,制表符和回车所有能产生空白的字符)
# 前三位是字母数字下划线,第四位是一个空白,最后一位是任意字符
re_str = r'\w\w\w\s.'
result = fullmatch(re_str,'abc\t%')
print(result)

# 4) \d匹配一个数字字符
# 前三位是数字,最后一位是任意字符
re_str = r'\d\d\d.'
result = fullmatch(re_str,'123G')
print(result)

# 5) \b检测是否是单词边界(单词的开头、结尾、单词和单词之间的标点空格等)
# \b不参与匹配,when\bwhere(错误的正则表达式),在匹配的时候\b不参与匹配,只是在匹配成功后再\b的位置
# 去检测\b的位置是否是边界
# 前四位是when第五位是空白,空白是where,并且第四位n的后面要是单词边界
# 注意:正则中遇到\b,匹配的时候先不管它,匹配成功后再回头看\b位置是否是单词边界
re_str = r'when\b\swhere'
result = fullmatch(re_str,'when where')
print(result)

# 6)^检测字符串是否以给定的正则表达式开头,^检测的时候先不匹配,先匹配正则,匹配成功后
# 去检测^的位置是否以给定的正则表达式开始,
re_str = r'^\d\d\w'
result =fullmatch(re_str,'12w')
result = search(re_str,'12c')
print(result)

# 7)$ $检测字符串是否以给定的正则表达式结束,不参与匹配
# 匹配一个字符串是否以一个w和数字结尾
re_str = r'w\d$'
result = search(re_str,'1234w1')
print(result)

# 8) \W 匹配非数字,字母,下划线的字符
re_str =r'\W\w'
result = fullmatch(re_str,'&1')
print(result)
# 9) \S匹配非空白字符
re_str = r'\S\w\w\w'
result = fullmatch(re_str,'ssss')
print(result)

# 10) \D匹配非数字字符
re_str = r'\D\d\d\d'
result = fullmatch(re_str,'x123')
print(result)

# 11) \B 检测非单词边界
re_str = r'when\Bwhere'
result = fullmatch(re_str,'whenwhere')
print(result)

# =======================匹配次数==========================
# 12)[] 匹配中括号中出现的任意字符
# 注意:一个中括号只匹配一个字符
# 匹配一个三位的字符串,第一位是a或者b或者c,后两位是数字
re_str = r'[abc+]\d\d'
result = fullmatch(re_str,'+67')
print(result)
# -在正则中的中括号里面的应用:如果将-放到两个字符中间,代表的额是谁到谁,
# 如果想要表示'-'符号本身就放在开头或者结尾
# 要求一个字符串中第一个是1-8中的一个,后面两位是小写字母
# [1-8]:代表的字符集是:12345678
# [-18]或者[18-]:代表的字符集是1,8,-
res_str = r'[1-8][a-z][a-z]'
result = fullmatch(res_str,'1ac')
print(result)
# 13)[^字符集]匹配不在[]字符集中的任意一个字符
# 匹配一个四位的字符串,第一位不是小写字母,后三位为任意字符
res_str = r'[^A-Z]s'
result = fullmatch(res_str,'zs')
print(result)
# 14)*匹配0次或者多次
# 匹配一个字符串,最后一位是b,b的前面有0个或者多个a
# a匹配0次或者多次,b匹配一次
re_str = r'a*b'
result = fullmatch(re_str,'aab')
print(result)
# 匹配0个或者多个数字
re_str = r'\d*'

# 15)+匹配一次或者多次,至少一次
re_str = r'[abc]+123'
result = fullmatch(re_str,'a123')
print(result)
# 判断一个字符串是否是无符号的正整数
re_str = r'[1-9]+\d*'
result = fullmatch(re_str,'100')
print(result)

# 注意:次数相关的操作都是约束的次数符号前的前一个字符
# 16)?匹配0次或者1次
re_str = r'1?'
result = fullmatch(re_str,'')
print(result)
# 判断一个字符串是否是整数(正整数负整数)
re_str = r'[+-]?[1-9]+\d*'
result = fullmatch(re_str,'-100')
print(result)
# 17){n} 匹配n次
re_str = r'\d{3}'
re_str = r'[a-zA-Z]{3}'
result = fullmatch(re_str,'abc')
print(result)

# 18) {m,}  至少匹配m次
re_str = r'\w{3,}'
result = fullmatch(re_str,'123355')
print(result)

# 19){,n}最多匹配n次
re_str = r'a{,4}b'
result = fullmatch(re_str,'b')
print(result)

# 20){m,n}至少匹配m次,最多匹配n次,要求n要大于m
re_str = r'\d{3,11}'
result =fullmatch(re_str,'110')
print(result)

# 练习:输入用户名和qq好
# 用户名必须由字母,数字或下划线构成长度在6-20个字符之间
# qq号是5-12的数字首位不能为零

# name_re =r'\w{6,20}'
# qq_re = r'[1-9]\d{4,11}'

# name = input('请输入用户名:')
# name = fullmatch(name_re,name)
# qq = input('请输入qq:')
# qq = fullmatch(qq_re,qq)
# if not name:
#   print('用户名必须由字母,数字或下划线构成长度在6-20个字符之间')
# elif not qq:
#   print('qq号是5-12的数字首位不能为零')
# else:
#   print('输入正确')
# ==========================3.分之和分组
# 21) | 分之(相当于逻辑运算中的or)
re_str = r'\d{3}[a-zA-Z]{3}|\d{3}|\dabc'
print(fullmatch(re_str,'123abc'))

# 注意:\d{3}[a-zA-Z]{3}是分之的第一个条件,\d{3}是分之的第二个条件\dabc是分之的第三个条件
# 正则中的分之有短路操作,如果前面的条件满足要求了,后面的就不会执行
# 如果使用|去连接多个条件,前面的条件已经匹配出结果,那么久不会使用后面的
# 

# 练习:写一个正则表达式,能够匹配出所有的数字(包括整数和小数)
re_str = r'[+-]?[1-9]\d*|[+-]?\d+[.]\d+'
result = fullmatch(re_str,'1')
print(result)
print(findall(re_str,'abc12.5hhh60,30.2kkk9nn0.12'))
# 注意:在匹配的时候如果有|那么把简单的放在前面
# 22)分组,可以通过加()来对正则条件进行分组
# 两位数字两位字母出现3次,
re_str = r'([a-zA-Z]{2}\d{2}){3}'
result = fullmatch(re_str,'ab12ab12ab12')
print(result)
# 匹配一个字符串,按照一个数字一个字母的规律出现一次或者多次
re_str = r'(\d[a-zA-Z])+'

# b.重复
# 可以通过\数字来重复匹配前面的分组中匹配的结果。数字的值代表前面的第几个分组
re_str = r'(\d{2}[A-Z])(=%)\1\2'
print(fullmatch(re_str,'23B=%23B=%'))

# c.捕获
# 只有在查找的时候有效findall,按照完整的正则表达式去匹配,但是取结果的时候
# 只捕获括号中的内容
re_str = r'a(\d{3})b'
print(findall(re_str,'a786b'))


# 23)正则里面的转义字符:正则表达式中的转义字母没有任何关系。在python中
# 字符串的前面加r阻止的是字符的转义,不能那个阻止正则表达式的转义
# 注意:
#   a.'-'只有在中括号中的两个字符之间才有特殊的意义
#   b. ()在正则表达式中也需要转义
#   c.[]也需要转义
#   d.$,^,+,?,*,|都需要转义
#   e.如果特殊符号是放在中括号中作为字符集的内容,那么除了-号在两个字符之间以外其他
#   的都不需要转义
#   f.\不管在哪儿都需要转义,^放在中括号的最前面需要转义
# 在正则表达式中,可以通过在有特殊意义的符号前加'\'来表示符号本身
# re_str = r'a\+'   这个需要加
# re_str = r'\+a'   这个也需要加
# re_str = r'\\w'   表示匹配\w


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

推荐阅读更多精彩内容

  • 正则表达式 正则表达式就是用来检测字符串是否满足某种规则的工具例如:匹配手机号、邮箱、脏话检测等 1、单字符 py...
    Deathfeeling阅读 316评论 2 1
  • python的re模块--细说正则表达式 可能是东半球最详细最全面的re教程,翻译自官方文档,因为官方文档写的是真...
    立而人阅读 22,854评论 4 46
  • re模块手册 本模块提供了和Perl里的正则表达式类似的功能,不关是正则表达式本身还是被搜索的字符串,都可以...
    喜欢吃栗子阅读 3,995评论 0 13
  • 落幕夕阳,执笔墨香,淡淡幽意清凉。 怀古望,砯崖回畅,嫩茶香。 此之从容客之扬长,洒脱人之挥忘。 陌途他乡,但寻解...
    木决阅读 360评论 4 11
  • 再平庸的人,身上都蕴藏着钻石, “要想找到这颗钻石, 请先思考你有什么样的兴趣爱好。 不要因为某项兴趣看来太过普通...
    2e2b1130439e阅读 153评论 0 0