正则表达式模式
模式字符串使用特殊的语法来表示一个正则表达式:
字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。
多数字母和数字前加一个反斜杠时会拥有不同的含义。
标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
反斜杠本身需要使用反斜杠转义。
由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r'\t',等价于 '\\t')匹配相应的特殊字符。
下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。
1.点号.
匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
import re
print(re.findall('ni.','nih')) #['nih']
print(re.findall('ni.','ni\n')) #[],除了换行符
print(re.findall('n.i','nni')) #['nni']
2.转义字符\
去元字符的特殊含义,让特异功能消失
print(re.findall('to\.m','to.m')) #['to.m']
print(re.findall('to\\nm','to\nm')) #['to\nm']
print(re.findall('to\nm','to\nm')) #['to\nm']
print('to\nm') #to 这里有换行 m
这里也有更方便的方法:
# print(r'ben\nhaha') # 去转义 前面加个r就可以了
3.*号
# 匹配0个或多个的表达式。
print(re.findall('to*m','tm')) #['tm'] ----0次
print(re.findall('to*m','toooom')) #匹配前面一个字符0次或者多次 ------多次
4.+号
# 匹配前面字符的1次或者多次(和*号的区别,就是不能匹配0次)
print(re.findall('be+n','beeeen')) #['beeeen']
print(re.findall('be+n','bn')) #[]
5.?号
# 匹配前面字符的0次或者1次
print(re.findall('be?n','bn')) #0次
print(re.findall('be?n','ben')) #1次
print(re.findall('be?n','beeeeen')) #只能匹配0次和1次
#注意:+,*,?:一起理解,功能一样,区别是次数的不同而已
6.^符号
#匹配字符串的开头
print(re.findall('^test123','123test')) #[]
print(re.findall('^test','test789')) #['test']
7.$符号
#匹配字符串结尾
print(re.findall(r'ha$','123ha')) #['ha']
print(re.findall(r'ha$','123')) #[]
8.|符号
# |符号:从左边--->右边开始匹配,任意一个满足即可
print(re.findall(r'ben|eric','123')) #[]
print(re.findall(r'ben|eric','ben123')) #['ben']
print(re.findall(r'ben|eric','eric123')) #['eric']
9.{}大括号
#匹配前面字符的m次
print(re.findall('b{1}e{3}n{2}','hahabeeenn'))
print(re.findall('b{1,3}e{3}n{2}','hahabbeeenn'))
print(re.findall('b{1,}e{3,}n{2}','hahabbbbeeeenn')) # 最少 b{1,} 等价于b+
10.[]括号
# 字符集合:对应匹配的字符是字符集里面的任意字符即可
print(re.findall('[ben]','b')) #['b']
print(re.findall('[ben]','n')) #['n']
print(re.findall('[ben]','d')) #[]
print(re.findall('[ben]{4}','bbbbbeeeeenn')) #['bbbb', 'beee', 'eenn']
11.()括号
# 匹配之后的结果打散,匹配结果分为若干部分
a = re.compile(r'(ben){1}(\w+){2}([a-z]{2})(\w+)')
ret = a.match('ben98zzDDD')
if ret:
print(ret.group()) #ben98zzDDD
print(ret.group(1)) #ben
print(ret.group(2)) #8
print(ret.group(3)) #zz
特殊字符类
# 1.\d:0-9
print(re.findall('b\d{2}en','b987en')) #[]
print(re.findall('b\d{3}en','b987en')) #['b987en']
#2.\D:匹配非数字
print(re.findall('b\D{3}en','bdgfen')) #['bdgfen']
print(re.findall('b\D{3}en','b789en')) #[]
#3.\s:匹配空格
print(re.findall('ben\seric\sgavin','ben eric gavin')) #['ben eric gavin']
print(re.findall('ben\seric\sgavin','beneric gavin')) #[]
#4.\S:匹配非空格
print(re.findall('ben\Sen','benben')) #['benben']
print(re.findall('ben\Sen','ben\nen')) #[]
# 5.\w:匹配a-z,A-Z,0-9,_(4部分)
# 等价于'[A-Za-z0-9_]'
print(re.findall('\w{3}','b_A')) #['b_A']
print(re.findall('\w{3}','123456findall')) #['123', '456', 'fin', 'dal']
# 6.\W:与\w相反,4部分之外
#等价于 '[^A-Za-z0-9_]'
print(re.findall('\W{3}',']\[]#'))
#7.分组起名
a_str = '20180311562'
pattern =(r'(?P<入学时间>\d{8})(?P<编号>\d{3})')
ret = re.match(pattern,a_str)
print(ret.groupdict())
| 实例 |描述 |
|-[Pp]ython-|-匹配 "Python" 或 "python"-|
| rub[ye] | 匹配 "ruby" 或 "rube"
| [aeiou] | 匹配中括号内的任意一个字母
| [0-9] | 匹配任何数字。类似于 [0123456789]
| [a-z]| 匹配任何小写字母
| [A-Z] | 匹配任何大写字母
| [a-zA-Z0-9] | 匹配任何字母及数字
| [^aeiou] | 除了aeiou字母以外的所有字符
| [^0-9]| 匹配除了数字外的字符