python之正则表达式

第一章 re模块

1.什么是正则?

    和shell中的差不多

 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。(在Python中)它内嵌在Python中,并通过 re 模块实现。正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹配引擎执行。

元字符 匹配内容
\w 匹配字母(包含中文)或数字或下划线
\W 匹配非字母(包含中文)或数字或下划线
\s 匹配任意的空白符
\S 匹配任意非空白符
\d 匹配数字
\D 匹配非数字
\A 从字符串开头匹配
\z 匹配字符串的结束,如果是换行,只匹配到换行前的结果
\n 匹配一个换行符
\t 匹配一个制表符
^ 匹配字符串的开始
$ 匹配字符串的结尾
. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...] 匹配字符组中的字符
[^] 匹配除了字符组中的字符的所有字符
* 匹配0个或者多个左边的字符。
+ 匹配一个或者多个左边的字符。
匹配0个或者1个左边的字符,非贪婪方式。
精准匹配n个前面的表达式。
匹配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张 @!\n \t'
print(re.findall('\s',s))
#[' ', '\n', ' ', '\t']
# 查找非任意空格,换行符,制表符
s = 'zbb张 @!\n \t'
print(re.findall('\S',s))
# ['z', 'b', 'b', '张', '@', '!']
# 查找数字
s = 'z12bb张 @!\n \t'
print(re.findall('\d',s))
# ['1', '2']
# 查找非数字
s = 'z12bb张 @!\n \t'
print(re.findall('\D',s))
# ['z', 'b', 'b', '张', ' ', '@', '!', '\n', ' ', '\t']
# 查找是否以什么开头的内容
s = 'z12bb张_zbb @!\n \t'
print(re.findall('^z',s))
# print(re.findall('\Az',s))
# ['z']
# 查找是否以什么结尾的内容
s = 'z12bb张_zbb @!'
print(re.findall('!$',s))
# print(re.findall('!\Z',s))
# ['!']
# 查找换行符,制表符
s = 'z12bb张_zbb \n \t@!'
print(re.findall('\n',s))
print(re.findall('\t',s))
# ['\n']
# ['\t']
# .只能匹配任意一个内容(非换行符)
s = 'z\nb12bb张_z\tb \n \t@!'
print(re.findall('z.b',s))
print(re.findall('z.b',s,re.DOTALL)) #可以匹配到换行符
# ['z\tb']
# ['z\nb', 'z\tb']
s = 'z\nb12bbA张_z\tb \n \t@!'
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\nb12bbA张_z\tb \n \t@!'
print(re.findall("[^a-z]",s))
# ['\n', '1', '2', 'A', '张'...]
# * 匹配 0个多个  [贪婪匹配]
s = 'z\nb12bbA张_z\tb \n \t@!'
print(re.findall("z*",s))
#print(re.findall("z*b",s))
#  匹配 1个多个  [贪婪匹配]
s = 'zzzzb12bbA张_zb \n \t@!'
print(re.findall("z+",s))
#['zzzz', 'z']
#   ? 匹配 0个或1个 [非贪婪匹配]
s = 'zb12bbA张_zb \n \t@!'
print(re.findall("z?",s))
#['z', '', '', '', '', 'z', '', '....]
#  s重复2次
s = 'zb12bbA张_zbb \n \t@!'
print(re.findall("b{2}",s))
#['bb', 'bb']
# 指定最少多少次,最多多少次
s = 'zb12bbA张_zzbbzzz \n \t@!'
print(re.findall("z{1,3}",s))   
#['z', 'zz', 'zzz']
# a|b 或
s = 'zb12bbA张_zzbbzzz \n \t@!'
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())
posted @ 2019-07-29 20:38  追梦nan  阅读(274)  评论(0编辑  收藏  举报