正則表達式模式
模式字符串使用特殊的語法來表示一個正則表達式:
字母和數字表示他們自身。一個正則表達式模式中的字母和數字匹配同樣的字符串。
多數字母和數字前加一個反斜槓時會擁有不同的含義。
標點符號只有被轉義時才匹配自身,否則它們表示特殊的含義。
反斜槓本身需要使用反斜槓轉義。
由於正則表達式通常都包含反斜槓,所以你最好使用原始字符串來表示它們。模式元素(如 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]| 匹配除了數字外的字符