1. 程式人生 > >模式匹配與正則表示式

模式匹配與正則表示式

一、正則表示式基礎

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、正則表示式知識彙總:

  1.  ?匹配零次或者一次前面的分組
  2. *匹配零次或者多次前面的分組
  3. +匹配一次或者多次前面的分組
  4. {n}匹配n次前面的分組
  5. {,m}匹配零次到m次前面的分組
  6. {n, }匹配n次到更多前面的分組
  7. {n,m}匹配至少n次,至多m次前面的分組
  8. {n,m}?或者*?或者+?對淺見的分組盡心非貪心的匹配
  9. ^spam意味著字串必須以spam開始
  10. spam$意味著字串必須以spam結束
  11. .點匹配除了換行符之外的所有字元
  12. \d  \w \s分別匹配數字,單詞和空格 ,大寫的字母情況下是相反匹配
  13. [abc]匹配方括號內的任意字元
  14. [^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,作為第二個引數。

       使用管道符號| 將變數組合起來,作為第二個引數,在這裡是按位或的關係