寫在前面
Python 的 re 模塊(Regular Expression 正則運算式)提供了各種正則運算式的匹配操作,在文本決議、復雜字串提取時起到很重要的作用,本篇詳細講解 re 模塊的使用,
re.match()
re.match() 從字串的起始位置按模式匹配,如果匹配不成功,或者不是在起始位置匹配成功,回傳 None ,匹配成功時回傳一個結果物件,
re.match(pattern, string, flags=0)
- pattern:匹配的正則運算式
- string:源字串
- flags:標志位,用于控制正則運算式的匹配方式,如是否區分大小寫、是否多行匹配等,如
re.I匹配時忽略字串中的大小寫,
import re
print(re.match('aa', 'Aaaabc', flags=re.I))
print(re.match('aa', 'bbaabc', flags=re.I))

上面第一條結果回傳成功匹配的物件,可以用 group(num) 或 groups() 函式獲取匹配結果,也可以用 span(num) 獲取匹配結果在源字串中開始和結束的位置,
先來看一下 group(num) 與 groups() 的用法,
- group(num=0):根據輸入的組號(或多個組號),回傳一個字串(或元組),元組中包含組號的對應的撇皮結果,默認為 0,即回傳
re.match()匹配到的完整內容, - groups():回傳一個包含指定組號字串的元組,從 1 到 最后,
直接看例子更清晰
line = "Python新視野"
matchObj = re.match(r'(.*)新(.*)', line)
print("matchObj.group(0) : ", matchObj.group())
print("matchObj.group(1, 2) : ", matchObj.group(1, 2))
print("matchObj.groups() : ", matchObj.groups())

matchObj 匹配的所有結果其實就是 ('Python新視野', 'Python', '視野') ,group(num) 中的 num 實際就是匹配結果對應的索引,這樣再來看上面的結果應該就很清晰了,同時可以看到 groups() 實際相當于 group(1, 2, ... , max),
明白了 group(num) 的用法,那么 span(num) 其實就很好理解,它與 group 的不同之處在于它的回傳結果是匹配結果在源字串中的起始與結束的索引,
print("matchObj.span(0) : ", matchObj.span(0))
print("matchObj.span(2) : ", matchObj.span(2))

re.search()
re.search () 在整個字串匹配并回傳第一個成功的匹配,
re.search(pattern, string, flags=0)
re.match() 與 re.search() 的不同之處很好理解,re.match() 是只匹配開頭的字串,如果匹配失敗,后面的將不再匹配,直接回傳 None ,而 re.search() 是在整個字串中匹配,如果起始位置沒有匹配到,那么它會繼續匹配剩余的字串,直到第一次匹配成功,如果字串結束都沒有匹配成功,那么回傳 None ,使用時要注意如果匹配失敗的話就不能實用 span(num) 等函式獲取匹配結果了哦!
看個例子,
try:
print(re.search('aa','aaaabc').span())
print(re.search('aa','bbaaac').span())
print(re.search('aa','bbaccc').span()) # 匹配失敗
except Exception as e:
print(e)

re.findall()
re.findall() 用于在字串中找到正則運算式所匹配的所有子串,并回傳一個串列,如果沒有找到匹配的,則回傳空串列,它與 re.match() 作用十分詳細,唯一不同就是 re.match() 不但包含了字串,還包含了匹配到的完整結果,看個例子,一目了然!
re.findall(pattern, string, flags=0)
line = "Python新視野"
print('re.findall:', re.findall(r'(.*)新(.*)', line))
print('re.match:', re.match(r'(.*)新(.*)', line).group(0, 1, 2))

re.finditer()
re.finditer() 在字串中找到正則運算式所匹配的所有子串,并把它們作為一個迭代器回傳,
re.finditer(pattern, string, flags=0)
result = re.finditer(r"\d+", "A1B2C3")
for match in result:
print(match.group())

re.sub()
re.sub() 函式可以將字串中滿足匹配條件的內容全部替換,
re.search(pattern, repl, string, count, flags=0)
- repl:替換的字串,可以是一個函式,
- count:匹配成功后替換的最大次數,默認為0,表示替換所有的匹配,
line = 'sun是菜雞'
# ?<= 匹配“是”后面的字符
print(re.sub(r'(?<=是).*', '大佬', line))

配合 lambda 使用
line = 'A2B2C3'
print(re.sub(r'(\d+)', lambda x: str(int(x.group())*2), line))

re.subn()
re.subn() 與 re.sub() 用法相同,只是回傳的結果中包含了替換的次數,
line = 'sun是菜雞 向日葵是菜雞'
print(re.sub(r'(?<=是).{2}', '大佬', line, count=1))
print(re.subn(r'(?<=是).{2}', '大佬', line, count=1))

re.split()
根據模式分割源字串,回傳一個包含結果子字串的串列,
re.split(pattern, string, maxsplit=0, flags=0)
- maxsplit:最大分割次數,默認為 0 ,表示進行最大次數的分割,如果
maxsplit非零,則最多發生maxsplit次拆分,并且字串的剩余部分作為串列的最后一個元素回傳,
print(re.split(r"\d+", "A1B2C3"))
print(re.split(r"\d+", "A1B2C3", 2))

re.compile()
re.compile() 用于編譯正則運算式,生成一個正則運算式(Pattern)物件,re.compile() 可以搭配上面一些函式一起使用,
re.compile(pattern[, flags])
- pattern:一個字串形式的正則運算式,
re.compile() 的用法不難,但要注意的是當它與上面幾個函式一起使用時,函式引數有些不同,
match()、search()、findall()、finditer()引數均增加了兩個可選引數:
- pos:可選引數,指定字串的起始位置,默認為0,
- endpos:可選引數,指定字串的結束位置,默認為字串的長度,
pattern = re.compile(r'\d+')
print(pattern.findall('A1B2C3'))
print(pattern.findall('A1B2C3', 0, 4))


對于剛入門 Python 或是想要入門 Python 的小伙伴,可以通過下方小卡片聯系作者,一起交流學習,都是從新手走過來的,有時候一個簡單的問題卡很久,但可能別人的一點撥就會恍然大悟,由衷的希望大家能夠共同進步,另外還有大量的學習資料,等你領取哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/350956.html
標籤:python
上一篇:pandas使用pd.concat縱向合并多個dataframe實戰:多個dataframe的縱向合并、為縱向合并的多個dataframe設定識別符號指定資料來源
