第四十篇 re模塊

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)
相關文章
相關標籤/搜索