正则表达式的系统学习
作者:互联网
正则表达式的系统学习
概念:
- 正则表达式是为了找到符合某种模式的字符串,这些模式包括:是什么字符串、重复多少次、在什么位置、有哪些额外的约束。这里的每一句话对应这正则表达式的一种语法。
1.正则表达式的7种境界
#正则表达式的7个境界
# level1 - 固定的字符串
import re
print(re.findall(r'168', text)) #fianall返回的是一个列表
level2 - 某一类字符
print(re.findall(r'\d', text)) #\d返回的是单个数字
print(re.findall(r'\d', text)) #\d返回的是单个数字
print(re.findall(r'\D', text)) #\D返回的是非数字
print(re.findall(r'\w', text)) #\w返回的是非标点符号的其他字符
print(re.findall(r'[1-5]', text)) #[]表示从中挑一个就行
print(re.findall(r'[高重非]', text)) #[]表示从中挑一个就行
# level3 - 重复某一类字符
text = '麦叔身高:178,体重:168,学号:123456,密码:9527'
print(re.findall(r'\d+', text)) #+修饰前边的内容
print(re.findall(r'\d?', text)) #?表示0个或1个,结果为['', '', '', '', '', '1', '7', '8', '', '', '', '', '1', '6', '8', '', '', '', '', '1', '2', '3', '4', '5', '6', '', '', '', '', '9', '5', '2', '7', '']
print(re.findall(r'\d*', text)) #*表示0个或多个,结果为['', '', '', '', '', '178', '', '', '', '', '168', '', '', '', '', '123456', '', '', '', '', '9527', '']
print(re.findall(r'\d{4,}', text))#{}表示重复前面多少次,是个区间,该表示方法为大于4次,输出结果:['123456', '9527']
# leve4 - 组合level2
text = '麦叔电话是18812345678,他还有一个电话号码是18887654321,他爱好的数字是01234567891,他的座机是:0571-52152166'
print(re.findall(r"\d{3,4}-\d{7,8}",text)) #输出结果为:['0571-52152166'],区号匹配三位四位都可以,电话好匹配7位8位都行
# leve5 - 多种情况
#
# 要求:找出手机号码或者座机号码
text = '麦叔电话是18812345678,他还有一个电话号码是18887654321,他爱好的数字是01234567891,他的座机是:0571-52152166'
patter = "\d{3,4}-\d{7,8}|1\d{10}" #|表示都行
print(re.findall(patter,text))
#
# level6 - 限定位置
#
#要求:在句子开头的手机号码,或座机
text = '18812345678,他还有一个电话号码是18887654321,他爱好的数字是01234567891,他的座机是:0571-52152166'
parter = "^1\d{10}|\d{4}-\d{8}" #^以什么开头
print(re.findall(parter,text))
# level7 - 内部约束
#
# 要求:找出形如barbar, dardar的前后三个字母重复的字符串
text = 'barbar carcar harhel'
print(re.findall(r'(\w{3})(\1)', text)) #():表示一组一组的分好,\:表示引用。\1表示我要和前面括号中的一样(\2)表示和前面第二个人括号一样
#()分成两部分
2. 写正则表达式的步骤
如何写正则表达式呢?我总结了几个步骤。不管多复杂,基本上都百试不爽。
我们仍然以包含分机号码的座机电话号码为例,比如0571-88776655-9527,演示下面的步骤:
-
确定模式包含几个子模式
它包含3个子模式:0571-88776655-9527。这3个子模式用固定字符连接。
-
各个部分的字符分类是什么
这3个子模式都是数字类型,可以用\d。现在可以写出模式为:
\d-\d-\d
-
各个子模式如何重复
第1个子模式重复3到4次,因为有010和021等直辖市
第2个子模式重复7到8次,有的地区只有7位电话号码
第3个子模式重复3-4次
加上次数限制后,模式成为:
\d{3,4}-\d{7,8}-\d{3,4}
但有的座机没有分机号,所以我们用或运算符让它支持两者:
\d{3,4}-\d{7,8}-\d{3,4}|\d{3,4}-\d{7,8}
-
是否有外部位置限制
没有
-
是否有内部制约关系
没有
#需求:匹配分机号码
tex = "0571-88776655-9527.dfvgai;;sdbv;asdv;asv;iasvi;cav"
pater = "\d{4}-\d{8}-\d{4}"
result = re.findall(pater,tex)
print(result)
[^3-8] 表示取反的意思,除了3-8之间都可以
abc{8}:c重复8次;(abc){8}:abc重复8次
4. Python正则模块re的用法
python的re模块还比较简单,包括以下几个方法:
- re.search():查找符合模式的字符,只返回第一个,返回Match对象,用来查找文件里有没有这种东西,
- re.match():和search一样,但要求必须从字符串开头匹配(和search一样都是只返回一个,返回的是一个对象,对象中包含了很多方法及属性)
- re.findall():返回所有匹配的字符串列表
- re.finditer():返回一个迭代器,其中包含所有的匹配,也就是Match对象
text = '麦叔电话是18812345678,他还有一个电话号码是18887654321,0581-52152166他爱好的数字是01234567891,他的座机是:0571-52152166'
it = re.finditer(r"(\d{4})-(\d{8})",text)
for m in it:
print(m) #返回的是一个对象,返回一个迭代器
-
re.sub():替换匹配的字符串,返回替换完成的文本
-
re.subn():替换匹配的字符串,返回替换完成的文本和替换的次数
text = "aBc,dafaa Abc ABC"
result = re.sub(r"abc","***",text,flags=re.I) #输出结果:***,dafaa *** ***,前面是要匹配的目标,后面是匹配的内容
print(result)
-
re.split():用匹配表达式的字符串做分隔符分割原字符串
text = "aBc,dafaa Abc ABC" result = re.split(r"\s*[,;/]\s*",text) #分割,输出的结果为 ['aBc', 'dafaa Abc ABC'] print(result)
- re.compile():把正则表达式编译成一个对象,方便后面使用 #compile:把正则表达式变成一个可传递的对象
标签:返回,正则表达式,text,系统,学习,re,print,findall 来源: https://www.cnblogs.com/yangzilaing/p/15799547.html