模式匹配與正則表示式
一、正則表示式基礎
1、regex:是一種文字模式的描述方法
2、re.compile()向它傳入一個字串值,表示正則表示式,它將返回一個Regex模式物件(簡稱為Regex物件:正則物件)
3、Regex物件的search()方法查詢傳入的字串,尋找正則表示式的所有匹配。沒有找到返回None ,找到返回Match物件,該物件有一個group()方法,它返回被查詢字串中實際匹配的文字。
4、group() 1返回第一個匹配項,2返回第二個匹配項,0 或者不傳入引數,返回整個文字。groups()返回所有的分組
5、\(和\)轉移字元將匹配實際的括號字元
6、字元 | 稱為管道,用於匹配許多表達式中的一個,或的關係。第一次出現的字串就返回匹配結果,findall()方法將找到所有的匹配的地方
7、星號* 意味著匹配零次或者多次,即星號之前的分組,可以在文字中出現任意次數,0~無窮
8、加號+ 意味著匹配一次或者多次,至少一次匹配
9、花括號{3}:指定匹配的次數,{3,6}:最少3次,最多6次
10、Python的正則表示式預設是貪心演算法,在沒有二義的情況下,它們會盡可能的匹配最長的字串。花括號的非貪心演算法版本匹配儘可能端的字串比如指定了{3},就算有4個也只會匹配3個
11、search()方法返回一個Match物件, 包括被查詢的字串中的“第一次”匹配的文字, findall()方法將返回一組字串,包含被查詢的字串中的所有的匹配;另外,findall()方法返回的不是一個Match物件,而是一個字串列表。有l兩種情況,對於沒有分組的正則表示式,返回列表中就是被查詢的字串,對於有分組的正則表示式,返回的是元組的列表
phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') # has no groups res =phoneNumRegex.findall('Cell:415-666-5555 work:212-555-5555') print(res) phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)') # has no groups res =phoneNumRegex.findall('Cell:415-666-5555 work:212-555-5555') print(res) # the result is below: ['415-666-5555', '212-555-5555'] [('415', '666-5555'), ('212', '555-5555')]
12、正則表示式字元分類:\d :0--9的任何數字 \D:除了0--9數字之類的任何字元 \w:任何字元,數字或者下劃線字元 \W:除了字元,數字和下劃線之外的任何字元 \s:空格,製表符,換行符 \S:除了空格,製表符,換行符以外的任何字元 。
13、用方括號[adcdefg]定義自己的字元分類,用來匹配字串。
[a-z0-9]:短橫線表示字元或者數字的範圍,在方括號內,普通的正則表示式符號不會被解釋,所以不需要加上轉移符號。
在方括號的左側加上[^abcdef]表示非字元類,也就是將匹配不在這個字元類中的所有字元。
14、在正則表示式開始位置使用^Hello,表示匹配必須發生在被查詢文字開始處。 類似,在末尾新增Hello$表示該字串必須以
這個正則表示式的模式結束。也可以兩個符號同時使用。
15、正則表示式中:句點 "."字元稱為萬用字元,它匹配除了換行之外的所有字元。但是句號點字元只能匹配一個字元。
點和星連起來就可以匹配任意文字: " .* ":表示除了換行符外的其他任意文字,是一種貪心模式,總是匹配儘可能多的文字。
如果要用非貪心模式:使用 .*?問號告訴python用非貪心模式進行匹配。
re.DOTALL 作為re.compile()的第二個引數,可以讓句點字元匹配所有的字元,包括換行符\n。
16、向re.compile()中傳入第二個引數re.IGNORECASE或者re.I 讓正則表示式不區分大小寫進行匹配。
17、正則表示式知識彙總:
- ?匹配零次或者一次前面的分組
- *匹配零次或者多次前面的分組
- +匹配一次或者多次前面的分組
- {n}匹配n次前面的分組
- {,m}匹配零次到m次前面的分組
- {n, }匹配n次到更多前面的分組
- {n,m}匹配至少n次,至多m次前面的分組
- {n,m}?或者*?或者+?對淺見的分組盡心非貪心的匹配
- ^spam意味著字串必須以spam開始
- spam$意味著字串必須以spam結束
- .點匹配除了換行符之外的所有字元
- \d \w \s分別匹配數字,單詞和空格 ,大寫的字母情況下是相反匹配
- [abc]匹配方括號內的任意字元
- [^abc]匹配除了在方括號內的任意字元
18、Regex物件的sub()方法用於將找到的字串用新的文字替換。傳入兩個引數,第一個引數是字串,用於取代發現的匹配,第二個引數是一個字串,即要替換的字串。結果返回替換完成後的字串。
nameRegex = re.compile(r'Agent \w+')
res = nameRegex.sub('CENSORED', 'Agent Alice gave the secrect documents to Agent Bot.')
print(res)
結果是:
CENSORED gave the secrect documents to CENSORED.
19、忽略正則表示式字串中的空白符和註釋,向re.cmpile()傳入變數re.VERBOSE,作為第二個引數。
使用管道符號| 將變數組合起來,作為第二個引數,在這裡是按位或的關係