正則表達式: 它是字元串的一種匹配模式,用來處理字元串,可以極大地減輕處理一些複雜字元串的代碼量 字元組:它是在同一位置可能出現的各種字元組成了一個字元組,用[]表示,但是它的結果只能是一個數字或者一個大寫字母或小寫字母等 下麵測試以該網站為例http://tool.chinaz.com/regex ...
正則表達式:
它是字元串的一種匹配模式,用來處理字元串,可以極大地減輕處理一些複雜字元串的代碼量
字元組:它是在同一位置可能出現的各種字元組成了一個字元組,用[]表示,但是它的結果只能是一個數字或者一個大寫字母或小寫字母等
下麵測試以該網站為例http://tool.chinaz.com/regex/
#正則表達式 匹配字元串 匹配結果 #[0-9] 9 9 [0-9]的寫法就相當於在用[0123456789] #[0123456789] 0 0 #[a-z] 1 None 這裡只匹配小寫字元a-z而不匹配數字 #[a-z] z z #[A-Z] A A 這裡只匹配大寫字元串 #[A-Z0-5a-c] A6b A、b 這裡的數字範圍只有到0-5所以沒匹配到6
元字元:
1.'.' 匹配除換行符以外的任意字元
#正則表達式 匹配字元串 匹配結果 # . a a # . 1 1 # . & & # . 換行符 None
2.'\w' 匹配字母或下劃線或數字--word
等價於[A-Z0-9a-z_]
#正則表達式 匹配字元串 匹配結果 # \w a a # \w 1 1 # \w & None # \w 換行符 None # \w _ _
3.'\s' 匹配任意的空白符--space
匹配字元串如果什麼都不寫也會匹配到一個結果,這裡的空白符有空格、tab鍵、回車等空白字元
4.'\d' 匹配任意的數字--digit
等價於[0-9]
#正則表達式 匹配字元串 匹配結果 # \d a None # \d 1 1 # \d & None
5.'\W' 匹配非字母或數字下劃線
和'\w'的結果相反,且空白字元也可以匹配,如果用[\w\W]就相當於全局匹配的效果;等價於[^A-Z0-9a-z_]
6.'\D' 匹配非字元
和'\d'的結果相反,且空白字元也可以匹配;等價於[^0-9]
7.'\S' 匹配非空白字元
和'\s'的結果相反,除了空白字元串其他都匹配
8.'\n' 匹配一個換行符
9.'\t' 匹配一個製表符(tab)
10.'\b' 匹配一個單詞的結尾
#正則表達式 匹配字元串 匹配結果 # .\b abx x 匹配一個字元並返回它的末尾字元 # b\b abb b 匹配一個字元串如果它的結尾是b就返回 # b\b aaa None
11.'\f' 匹配一個換頁符
12.'\r' 匹配一個回車符
13.'\v' 匹配一個垂直製表符
14.'\B' 匹配一個非單詞邊界
#正則表達式 匹配字元串 匹配結果 # v\B vers v # ve\B vers ve # s\B vers None
15.'\num' 匹配一個正整數
#正則表達式 匹配字元串 匹配結果 # (.)\1 1122 11、22 匹配連續相鄰的兩個字元
16.'^' 匹配字元串開始
相當於startswith()
#正則表達式 匹配字元串 匹配結果 # ^[A-Z] A456A A
17.'$' 匹配字元串結束
相當於endswith()
#正則表達式 匹配字元串 匹配結果 # [A-Z]$ ASD D
18.'a|b' 匹配字元串a或b
先看左邊符不符合條件,若符合則優先匹配左邊,否則匹配右邊
#正則表達式 匹配字元串 匹配結果 # 123|5 789a12352 123、5 #(ab|c)[0-9] 5ac5ab6 c5、ab6
19.'()' 匹配括弧內的表達式也表示一個組
如果要匹配左括弧'('就要用'\('語法,右括弧')'就要用'\)'
#正則表達式 匹配字元串 匹配結果 # ([a-z]) aswss a、s、w、s、s
20.'[...]' 匹配字元組的字元
21.‘[^...]’匹配除了字元組中字元的所有字元
#正則表達式 匹配字元串 匹配結果 # [^abc] erasdbc e、r、s、d
量詞:
用於約束前一個正則匹配的規則,要放在規則的後面
1.'*' 重覆零次或多次
0次就是不是正則表示里需要的元素也會算一次
#正則表達式 匹配字元串 匹配次數 # [a]* abaacaaa 6 # [a-z]* abc 2 # []* 1
2.'+' 重覆一次或更多次
#正則表達式 匹配字元串 匹配次數 # [a]+ abaacaaa 3 # [a-z]+ abc 1 # []+ 0
3.'?' 重覆零次或一次
#正則表達式 匹配字元串 匹配次數 # [a]? abaacaaa 9 # [a-z]? abc 4 # []? 1
4.'{n}' 重覆n次
5.'{n,}' 重覆n次或更多次
6.'{n,m}' 重覆n次到m次
#正則表達式 匹配字元串 匹配次數 匹配結果 # [a]{2,5} aaaaaaaaaaaaa 3 aaaaa、aaaaa、aaa #[a]{2,5}? aaaaaaaaaaaaa 6 aa、aa、aa、aa、aa、aa ?放在最後的作用是取最小的次數
用法註意:
1..^$
#正則表達式 匹配字元串 匹配結果 # a. abacadaf ab、ac、ad、af 匹配以a為開頭的字元串 # ^a. abacadaf ab 只匹配一個從字元串中以a開頭的字元串 # a.$ abacadaf af 只匹配一個從字元串中以a結尾的字元串
2.*+?{ }
#正則表達式 匹配字元串 匹配結果 # 一.? 一二一二三一二三四 一二、一二、一二 匹配一後面的一個任意字元 # 一.* 一二一二三一二三四 一二一二三一二三四 匹配一後面的0或多個任意字元 # 一.+ 一二一二三一二三四 一二一二三一二三四 匹配一後面的1或多個任意字元 # 一.{2,4} 一二一二三一二三四 一二一二三、一二三四 匹配一後面2-4個字元 # 一.{2,4}? 一二一二三一二三四 一二一、一二三 匹配一後面2個字元
*+?的匹配規則都屬於貪婪匹配,即儘可能多的匹配,而在規則的最後加?會變成惰性匹配,即儘可能少的匹配
3.字元集[ ][^]
#正則表達式 匹配字元串 匹配結果 # a[bcd]* ab|abc|abcd ab、abc、abcd # a[^|]* ab|abc|abcd ab、abc、abcd # [\d] 123a56bc 1、2、3、5、6 # [\d]+ 123a56bc 123、56
4.轉義符\
#正則表達式 匹配字元串 匹配結果 # \n \n None # \\n \n \n 這裡的第一個\充當轉義的作用 # \\\\n \\n \\n 每需要轉義一個\都要在前面寫一個\ # r\\\\n r\n r\n 加r會讓整個結果不轉義
5.非貪婪匹配
#正則表達式 匹配字元串 匹配結果 # a[a-z]*? aaaaaaa a、a、a、a、a、a、a(7次) # a[a-z]+? aaaaaaa aa、aa、aa(3次) # a[a-z]?? aaaaaaa a、a、a、a、a、a、a(7次) #a[a-z]{2,4}? aaaaaaa aaa、aaa(2次) #a[a-z]{2,}? aaaaaaa aaa、aaa(2次)
'.*?x’的作用是直到找到x就停止
#正則表達式 匹配字元串 匹配結果 # .*?a 45bjswakaabaa 45bjswa、ka、a、ba、a
6.身份證號是一個長度為15或18的字元串,如果是15位則全部是數字組成,首位不能為0,如果18位,則前17位全是數字,末尾可能是x或數字
# 正則表達式 匹配字元串 匹配結果 #^([1-9]\d{16}[0-9x]|[1-9]\d{14})$ 122345688989788 122345688989788 #^([1-9]\d{16}[0-9x]|[1-9]\d{14})$ 12234568898978811x 12234568898978811x
re模塊:
常用方法:
1.findall()
返回所有滿足匹配條件的結果並放在一個列表中
import re ret = re.findall('[a-z0-9]','aAbBcC123&') print(ret) #['a', 'b', 'c', '1', '2', '3']
優先順序:
這裡的問號具有取消分組優先順序的作用
import re ret = re.findall('www.(baidu|google).com', 'www.google.com') print(ret) #['google'] ret = re.findall('www.(?:baidu|google).com', 'www.google.com') print(ret) #['www.google.com']
2.search()
在字元串中從左到右找到一個符合匹配標準的就返回一個對象,如果ret沒有匹配到就返回None
import re ret = re.search('[a]+','12aaa78a8aa') print(ret) #<re.Match object; span=(2, 5), match='aaa'> print(ret.group()) #aaa ret2 = re.search('[A-Z]+','12aaa78a8aa') print(ret2) #None print(ret2.group()) #AttributeError: 'NoneType' object has no attribute 'group'
增加一個判斷,如果有匹配成功就返回匹配的字元串,沒成功就不執行
import re ret = re.search('[a]+','12aaa78a8aa') if ret: print(ret.group()) #aaa
註意:
import re ret = re.search('^[0-9](\d{5})(\d{2})?$','11534512') print(ret.group()) #11534512 print(ret.group(1)) #15345 拿到每一個分組的數值 print(ret.group(2)) #12
3.match()
這個方法就是從開頭開始匹配,如果正則規則能夠匹配的上開頭,那麼就返回一個對象,結果中的內容要group()方法才能顯示,如果沒有匹配上就返回None,調用group()就會報錯
import re ret = re.match('[0-9a-z]+','abc123A33a') print(ret) #<re.Match object; span=(0, 6), match='abc123'> if ret: print(ret.group()) #abc123
4.split()
先按'a'分割得到''和'bcd',再對''和'bcd'分別按'b'分割得到''和'cd',分割完的字元會消失
import re ret = re.split('[ab]','abcd') print(ret) #['', '', 'cd']
優先順序:
import re ret1 = re.split('\d+','abc1abcsw22asww3312a') print(ret1) #['abc', 'abcsw', 'asww', 'a'] ret2 = re.split('(\d+)','abc1abcsw22asww3312a') print(ret2) #['abc', '1', 'abcsw', '22', 'asww', '3312', 'a'] 加上了括弧之後能夠保留匹配項,沒加括弧則不保留匹配項
5.sub()
將正則規則匹配到的英文小寫字母替換成'&',後面的5表示只替換5次
import re ret = re.sub('[a-z]','&','eva3sdww4asd22H3',5) print(ret) #&&&3&&ww4asd22H3
6.subn()
和sub執行效果幾乎相同,結果會返回替換後的字元串和替換次數
import re ret = re.subn('[a-z]','&','eva3sdww4asd22H3',5) print(ret) #('&&&3&&ww4asd22H3', 5)
7.compile()
當一個正則規則需要被反覆的調用且它的正則表達式很長,它就需要用到compile()
import re obj = re.compile('\d{3,5}') #將正則表達式編譯成一個正則表達式對象,規則要匹配3-5個數字 ret = obj.search('abc12gha12432j1222') print(ret.group()) #12432 ret = obj.search('easda22132aasdw22sdaw') print(ret.group()) #22132
8.finditer()
結果可以返回一個存放結果的迭代器
import re ret = re.finditer('[a-z]{2,3}','12abs23saw7a8sddw') print(ret) #<callable_iterator object at 0x00000000027A2160> print([i.group() for i in ret]) #['abs', 'saw', 'sdd']
9.分組命名
import re ret = re.search("<(?P<tag_name>\w+)>\w+</(?P=tag_name)>","<h1>page</h1>") #在分組中利用?<name>的形式給分組取名字 print(ret.group('tag_name')) #h1 print(ret.group()) #<h1>page</h1>
import re ret = re.search(r"<(\w+)>\w+</\1>","<h1>page</h1>") #在分組中不想寫名字的話可以用\序號來找到對應的組,表示要找的內容和前面組內容一致 print(ret.group(1)) #h1 print(ret.group()) #<h1>page</h1>
10.flags參數
re.I(IGNORECASE):忽略大小寫,括弧內是完整的寫法
re.M(MULTILINE):多行模式,改變^和$的行為
re.S(DOTALL):點可以匹配任意字元,包括換行符
re.L(LOCALE):做本地化識別的匹配,表示特殊字元集 \w, \W, \b, \B, \s, \S 依賴於當前環境,不推薦使用
re.U(UNICODE):使用\w \W \s \S \d \D使用取決於unicode定義的字元屬性。在python3中預設使用該flag
re.X(VERBOSE):冗長模式,該模式下pattern字元串可以是多行的,忽略空白字元,並可以添加註釋