第一章 re模块
1.什么是正则?
和shell中的差不多
正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。
元字符 |
匹配内容 |
---|---|
w | 匹配字母(包含中文)或数字或下划线 |
W | 匹配非字母(包含中文)或数字或下划线 |
s | 匹配任意的空白符 |
S | 匹配任意非空白符 |
d | 匹配数字 |
D | 匹配非数字 |
A | 从字符串开头匹配 |
z | 匹配字符串的结束,如果是换行,只匹配到换行前的结果 |
匹配一个换行符 | |
匹配一个制表符 | |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结尾 |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 |
[...] | 匹配字符组中的字符 |
[^] | 匹配除了字符组中的字符的所有字符 |
* | 匹配0个或者多个左边的字符。 |
+ | 匹配一个或者多个左边的字符。 |
? | 匹配0个或者1个左边的字符,非贪婪方式。 |
{n} | 精准匹配n个前面的表达式。 |
{n,m} | 匹配n到m次由前面的正则表达式定义的片段,贪婪方式 |
ab | 匹配a或者b |
() | 匹配括号内的表达式,也表示一个组 |
第二章 练习
#从字符串中全部查找内容,返回的是列表
s = 'zbb张'
print(re.findall('zbb',s))
#['zbb']
s = 'zbb张'
#查找数字字母(中文),下划线
print(re.findall('w',s))
#['z', 'b', 'b', '张']
#查找非数字,字母(中文),下划线
s = 'zbb张@!'
print(re.findall('W',s))
#['@', '!']
# 查找任意空格,换行符,制表符
s = 'zbb张 @!
'
print(re.findall('s',s))
#[' ', '
', ' ', ' ']
# 查找非任意空格,换行符,制表符
s = 'zbb张 @!
'
print(re.findall('S',s))
# ['z', 'b', 'b', '张', '@', '!']
# 查找数字
s = 'z12bb张 @!
'
print(re.findall('d',s))
# ['1', '2']
# 查找非数字
s = 'z12bb张 @!
'
print(re.findall('D',s))
# ['z', 'b', 'b', '张', ' ', '@', '!', '
', ' ', ' ']
# 查找是否以什么开头的内容
s = 'z12bb张_zbb @!
'
print(re.findall('^z',s))
# print(re.findall('Az',s))
# ['z']
# 查找是否以什么结尾的内容
s = 'z12bb张_zbb @!'
print(re.findall('!$',s))
# print(re.findall('!',s))
# ['!']
# 查找换行符,制表符
s = 'z12bb张_zbb
@!'
print(re.findall('
',s))
print(re.findall(' ',s))
# ['
']
# [' ']
# .只能匹配任意一个内容(非换行符)
s = 'z
b12bb张_z b
@!'
print(re.findall('z.b',s))
print(re.findall('z.b',s,re.DOTALL)) #可以匹配到换行符
# ['z b']
# ['z
b', 'z b']
s = 'z
b12bbA张_z b
@!'
print(re.findall("[a-z]",s)) # 小写的a,z
print(re.findall("[A-Z]",s)) # 大写的A,Z
print(re.findall("[A-Za-z]",s)) # 大写和小写的a,z A,Z
print(re.findall("[a-z0-9]",s)) # 小写的a,z 数字 0,9
# ['z', 'b', 'b', 'b', 'z', 'b']
# ['A']
# ['z', 'b', 'b', 'b', 'A', 'z', 'b']
# ['z', 'b', '1', '2', 'b', 'b', 'z', 'b']
# 查找非a-z的元素
s = 'z
b12bbA张_z b
@!'
print(re.findall("[^a-z]",s))
# ['
', '1', '2', 'A', '张'...]
# * 匹配 0个多个 [贪婪匹配]
s = 'z
b12bbA张_z b
@!'
print(re.findall("z*",s))
#print(re.findall("z*b",s))
# 匹配 1个多个 [贪婪匹配]
s = 'zzzzb12bbA张_zb
@!'
print(re.findall("z+",s))
#['zzzz', 'z']
# ? 匹配 0个或1个 [非贪婪匹配]
s = 'zb12bbA张_zb
@!'
print(re.findall("z?",s))
#['z', '', '', '', '', 'z', '', '....]
# s重复2次
s = 'zb12bbA张_zbb
@!'
print(re.findall("b{2}",s))
#['bb', 'bb']
# 指定最少多少次,最多多少次
s = 'zb12bbA张_zzbbzzz
@!'
print(re.findall("z{1,3}",s))
#['z', 'zz', 'zzz']
# a|b 或
s = 'zb12bbA张_zzbbzzz
@!'
print(re.findall("z|b",s))
#['z', 'b', 'b', 'b', 'z', 'z', 'b', 'b', 'z', 'z', 'z']
# ?: 可以反回括号外的东西
s = "meet_assdf_mssst_(.)mmns_aaamaaatmsssssssssssstt"
print(re.findall("m(?:..)t",s))
s = 'zaq_sb wqe_sb ritian_sb'
print(re.findall("w+_sb",s))
# print(re.findall("[a-z]+_sb",s))
# ['zaq_sb', 'wqe_sb', 'ritian_sb']
第三章 常用方法
1. findall
全部找到返回一个列表
s = 'zaq_sb wqe_sb ritian_sb'
print(re.findall("zaq",s))
2.search
从字符串中任意位置进行匹配查找到一个就停止了,返回的是一个对象. 获取匹配的内容必须使用.group()进行获取
s = 'zaq_sb wqe_sb ritian_nb'
print(re.search("sb|nb",s).group())
3.match
从字符串开始位置进行匹配
#match 找到1个后就停止查找了,只从字符串的开头查找.找到后返回的是一个对象,查看元素.group()
s = 'zaq_sb wqe_sb ritian_nb'
print(re.match("zaq",s).group())
#zaq
#没有hui报错
4.spilit 分割
s = 'zaq_sb w:qe_sb#rit!ian_*nb'
print(re.split("[#,:!*]",s))
5.sub 替换
print(re.sub("barry","太亮",'barry是最好的讲师,barry就是一个普通老师,请不要将barry当男神对待。'))
6.compile
定义匹配规则(无用)
obj = re.compile("w")
print(obj.findall("zbb只能给你"))
7.finditer
返回的是一个迭代器
g = re.finditer("w","zbb:可是我还你想啊!")
print(next(g).group())
for i in g:
print(i.group())
8.给分组起名字
print(re.search("(?P<tag_name>w+)w+w+","h1hellh1"))
print(re.search("(?P<aaa>w+)dfa","asbsadfasdfa").group("aaa"))
print(re.search("(?P<cx>w+)dfa","asbsadfasdfa").group())