天天看點

python常用正規表達式Python正規表達式

Python正規表達式

常用函數

match(pat, str):檢查字元串的開頭是否符合某個模式

search(pat, str):檢查字元串中是否符合某個模式

findall(pat, str):傳回所有符合某個模式的字元串,以清單形式輸出

finditer(pat, str):傳回所有符合某個模式的字元串,以疊代器形式輸出

split(pat, str):以某個模式為分割點,拆分整個句子為一系列字元串,以清單形式輸出

sub(pat, repl, str):句子 str 中找到比對正規表達式模式的所有子字元串,用另一個字元串 repl 進行替換

compile(pat):将某個模式編譯成對象,供之後使用

re.match

從起始位置開始比對,傳回比對的對象;若無比對,則傳回

none

文法:

參數 說明
pattern 比對的正規表達式
string 要比對的字元串
flags 标志符,用于控制正規表達式的比對方式,如:是否區分大小寫,多行比對等

re.search

周遊字元串,并傳回第一個成功的比對

文法:

re.sub

替換字元串中的比對項

參數:

  • pattern : 正則中的模式字元串。
  • repl : 替換的字元串,也可為一個函數。
  • string : 要被查找替換的原始字元串。
  • count : 模式比對後替換的最大次數,預設 0 表示替換所有的比對。(可選)
  • flags : 編譯時用的比對模式,數字形式。(可選)

    e.g.1

import re
phone = "2004-959-559 # 這是一個電話号碼"
num = re.sub(r'#.*$',"",phone)  #去除注釋
## 2004-959-559 
           

e.g.2

import re

def double_num(matched):
	value=int(matched.group('value'))
	return str(value*2)
s = 'A23G4HFD567'
print(re.sub('(?P<value>\d+)', double, s))
           

compile函數

編譯正規表達式,生成pattren對象,供match() 和 search() 使用。

文法:

  • pattern : 一個字元串形式的正規表達式
  • flags 可選,表示比對模式,比如忽略大小寫,多行模式等,具體參數為:
    • re.I 忽略大小寫
    • re.L 表示特殊字元集 \w, \W, \b, \B, \s, \S 依賴于目前環境
    • re.M 多行模式
    • re.S 即為’ . ‘并且包括換行符在内的任意字元(’ . '不包括換行符)
    • re.U 表示特殊字元集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字元屬性資料庫
    • re.X 為了增加可讀性,忽略空格和’ # '後面的注釋

e.g.1

import re
pattern = re.compile(r'\d+')
pattren.metch('string')
           

findall

傳回一個清單,包含所有比對的子串

參數:

  • string 待比對的字元串。
  • pos 可選參數,指定字元串的起始位置,預設為 0。
  • endpos 可選參數,指定字元串的結束位置,預設為字元串的長度。

    e.g.1

import re
 
pattern = re.compile(r'\d+')   # 查找數字
result1 = pattern.findall('aaa 123 bbbb 456') #['123', '456']
result2 = pattern.findall('aa88bbb123ccccc456', 0, 10) #['88', '12']
           

re.finditer

傳回一個疊代器,包含所有比對的子串

文法:

e.g.1

import re
 
it = re.finditer(r"\d+","12a32bc43jf3") 
for match in it: 
    print (match.group() )
           

re.split

比對的分隔符兩邊的實體都會被當成是結果中的元素傳回。如果正規表達式中包含一個括号捕獲分組,那麼被比對的文本也将出現在結果清單中,目的是保留分割字元串。

s = 'Kobe Bryant loves Gianna Bryant'
print( re.split(r'\s', s) )
['Kobe', 'Bryant', 'loves', 'Gianna', 'Bryant']
           

轉義字元

常用

點 . 表示除新行(\n)的任意字元,它是個通配符。

托字元 ^ 表示字元串開頭。

美元符 $ 表示字元串結尾。

貪婪模式:

  • *

    表示後面可跟 0 個或多個字元
  • +

    表示後面可跟 1 個或多個字元
  • ?

    表示後面可跟 0 個或 1 個字元

非貪婪模式:

  • *?

    表示後面可跟 0 個或多個字元,但隻取第一個
  • +?

    表示後面可跟 1 個或多個字元,但隻取第一個
  • ??

    表示後面可跟 0 個或 1 個字元,但隻取第一個

限定邊界

{}

可以設定具體的上界或(和)下界,使得代碼更加有效也更好讀懂,規則如下:

  • {n} 左邊的字元串是否出現 n 次
  • {n, } 左邊的字元串是否出現大于等于 n 次
  • {, n} 左邊的字元串是否出現小于等于 n 次
  • {n, m} 左邊的字元串是否出現在 n 次和 m 次之間。

其他

反斜杠 \ 可對特殊字元進行轉義,也可對普通字元轉義。

\b:比對空字元串,但僅适用于單詞的“首尾”

\B:比對空字元串,但僅适用于單詞的“非首尾”

\d:比對任何“數字”字元,等價于 [0-9]

\D:比對任何“非數字”字元,等價于

[^0-9]

\s:比對任何“空白”字元,等價于

[\t\n\r]

\S:比對任何“非空白”字元,等價于

[^\t\n\r]

\w:比對任何“字母數字下劃線”字元,等價于

[a-zA-Z0-9_]

\W:比對任何“非字母數字下劃線”字元,等價于

[^a-zA-Z0-9_]

\A:比對句子的“開頭”字元,等價于 ^

\Z:比對句子的“結尾”字元,等價于 $

\t:比對句子的“制表鍵 (tab)”字元

\r:比對句子的“Enter鍵 (return)”字元

\n:比對句子的“換行鍵 (newline)”字元