python之正則表達式元字符

正則表達式模式

模式字符串使用特殊的語法來表示一個正則表達式:
字母和數字表示他們自身。一個正則表達式模式中的字母和數字匹配同樣的字符串。
多數字母和數字前加一個反斜槓時會擁有不同的含義。
標點符號只有被轉義時才匹配自身,否則它們表示特殊的含義。
反斜槓本身需要使用反斜槓轉義。
由於正則表達式通常都包含反斜槓,所以你最好使用原始字符串來表示它們。模式元素(如 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]| 匹配除了數字外的字符
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章