re模塊
import re
正則表達式,又稱規則表達式。正則表達式一般被用來檢索、替換那些符合某個模式(規則)的文本(也就是原字符串中有符合規則的就拿出來,沒有就繼續搜索)python
元字符
s = 'I am king, I amam27 years old, I want to go to study' # 1. ^ 獲取開頭字符 res = re.findall('^I',s) print(res) # ['I'] # 2. $ 獲取結尾字符 res = re.findall('study$',s) print(res) # ['study'] # 3. | 左右兩邊都輸出(or),獲取左右兩邊 res = re.findall('I am 27 years|I want to',s) print(res) # ['I am 27 years', 'I want to'] res = re.findall('^I|study$',s) print(res) # ['I', 'study'] # 4. [] 獲取字符串中全部符合[]中的元素,並按順序輸出 res = re.findall('[oldI]',s) print(res) # ['I', 'I', 'o', 'l', 'd', 'I', 'o', 'o', 'o', 'd'] # 5. . 一個 . 就是獲取任意一個字符 res = re.findall('...',s) # 每次獲取三個任意字符 print(res) # ['I a', 'm k', 'ing', ', I', ' am', ' 27', ' ye', 'ars', ' ol', 'd, ', 'I w', 'ant', ' to', ' go', ' to', ' st', 'udy'] # 6. {n}就是{}前的一個字符複製出n次以後組成的新字符串,去原字符串中找 # 若是{}前的字符串只有一個字符,且{}中是0,則表示用""(空)去匹配 st = '我我我我我我我我我我,我你,你我我我' res0 = re.findall('你你{0}',st) # 「你」 res1 = re.findall('我{3}',st) # 「我我我」 res2 = re.findall('你我{3}',st) # 「你我我我」 print(res0) # ['你', '你'] print(res1) # ['我我我', '我我我', '我我我', '我我我'] print(res2) # ['你我我我'] # 7. * 匹配前面的子表達式任意次。*等價於{0,}。 # 例如,zo*能匹配「z」,也能匹配「zo」以及「zoo」、「zooo」..... st = '我我我,我我,我' res0 = re.findall('我你*',st) # 「我」、「我你」、「我你你」...... res1 = re.findall('你*',st) # 「」、「你」、「你你」...... print(res0) # ['我', '我', '我', '我', '我', '我'] print(res1) # ['', '', '', '', '', '', '', '', ''] 彷佛與C中的字符串和字符數組有點淵源,最後一個字符可能默認是\n # 8. + 匹配前面的子表達式一次或屢次(大於等於1次)。+等價於{1,} # 例如,「zo+」能匹配「zo」以及「zoo」,但不能匹配「z」。 st = '我我你我你,我我,我' print(re.findall('你+',st)) # ['你', '你'] print(re.findall('我你+',st)) # ['我你', '我你'] # 須要理解貪婪和非貪婪,對於這些元字符,不加?都是默認爲貪婪,也就是在搜索時,會盡可能用匹配前面一個字符屢次的去對比原字符串 print(re.findall('我+',st)) # ['我我', '我', '我我', '我'] # 9. ? 匹配前面的子表達式0次或1次.中止符 st = '我我你我你,我我,我,我你他' print(re.findall('我?',st)) # ['我', '我', '', '我', '', '', '我', '我', '', '我', '', '我', '', '', ''] # 當 ? 字符緊跟在任何一個其餘限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式儘量少地匹配所搜索的字符串;而默認的貪婪模式則儘量多地匹配所搜索的字符串。 # 例如,對於字符串「oooo」,「o+」將盡量多地匹配「o」,獲得結果[「oooo」],而「o+?」將盡量少地匹配「o」,獲得結果 ['o', 'o', 'o', 'o'] # 10. \d 匹配數字 stri = 'i am 26 years old' print(re.findall('\d',stri)) # ['2', '6'] #11. \D 匹配非數字 stri = 'i am 26 years old' print(re.findall('\D',stri)) # ['i', ' ', 'a', 'm', ' ', ' ', 'y', 'e', 'a', 'r', 's', ' ', 'o', 'l', 'd'] # 12. \w 匹配包括下劃線的任何單詞字符 st = '我我你_我你,我%我,我,我你他' print(re.findall('\w',st)) # ['我', '我', '你', '_', '我', '你', '我', '我', '我', '我', '你', '他'] # 13 \W 非字母,數字,下劃線 print(re.findall('\W',st)) # [',', '%', ',', ','] # 14 \s 空 print(re.findall('\s',st)) # [] # 15. \S 非空 print(re.findall('\S',st)) # ['我', '我', '你', '_', '我', '你', ',', '我', '%', '我', ',', '我', ',', '我', '你', '他'] res = re.findall('^I.*?study$',s) print(res) ['I am king, I am 27 years old, I want to go to study'] # 16. (.*?) 非貪婪模式,找到一個了就中止 # 貪婪模式 .* s = '孫悟空找豬八戒找媳婦婦婦高$$$$$@@@@翠蘭,然____後asdfasdf吃西234234瓜,再吃 西瓜婦' res = re.findall('豬.*婦',s) print(res) # ['豬八戒找媳婦婦婦高$$$$$@@@@翠蘭,然____後asdfasdf吃西234234瓜,再吃 西瓜婦'] # 非貪婪模式 res = re.findall('豬.*?婦',s) print(res) # ['豬八戒找媳婦'] # 17. re.compile 寫一個通用的規則(要用到前面學到的元字符) s = 'i am 173' form1 = re.compile('\d') form2 = re.compile('\D') res1 = form1.findall(s) res2 = form2.findall(s) print(res1) # ['1', '7', '3'] print(res2) # ['i', ' ', 'a', 'm', ' '] # 18. match和search # re.match從頭開始匹配,找一個,若是在開頭沒有則返回None s = '從前有座山,山裏有個廟' res = re.match('有',s) print(res) # None s = '有座山,有座廟' res = re.match('有',s) print(res) # <_sre.SRE_Match object; span=(0, 1), match='有'> # re.search 搜索全部 s = '從前有座山,山裏有個廟' res = re.search('有',s) print(res) # <_sre.SRE_Match object; span=(2, 3), match='有'> # 19. 分組,須要的數據放入()就好了,括號外的就不會打印了 s = '有踢球的,有跑步的,有看書的,' res = re.findall('有(.*?),',s) print(res) # ['踢球的', '跑步的', '看書的'] # 20. re.split 與字符串的類似,只是裏面的參數用正則表達式 s = 'i am 26 years old' res = re.split('\d',s) print(res) # ['i am ', '', ' years old'] #21. sub 和 subn # 和字符串中的replace類似,subn會計算替換的次數 s = '昨天是1號,今天是2號,明天3號,後天4號放假' # re.sub sub_res = re.sub('\d','*',s) print(sub_res) # 昨天是*號,今天是*號,明天*號,後天*號放假 # re.subn subn_res = re.subn('\d','*',s) print(subn_res) # ('昨天是*號,今天是*號,明天*號,後天*號放假', 4)