Python正規表示式簡記和re庫

菌醬發表於2019-02-16

正規表示式是定義搜尋模式的字元序列。通常這種模式被字串搜尋演算法用於字串上的“查詢”或“查詢和替換”操作,或者用於輸入驗證。

1. 正規表示式的語法

  • . 表示任何單個字元
  • [] 字符集,對單個字元給出取值範圍
  • [^] 非字符集,對單個字元給出排除範圍
  • *前一個字元0次或者無限次擴充套件
  • +前一個字元1次或無限次擴充套件
  • ?前一個字元0次或1次擴充套件
  • |左右表示式任意一個
  • {m}擴充套件前一個字元m次
  • {m,n}擴充套件前一個字元m至n次
  • ^匹配字串開頭
  • $匹配字串結尾
  • ()分組標記,內部只能使用|操作符
  • d數字,等價於[0-9]
  • w單詞字元,等價於[A-Z,a-z,0-9]

2. python中re庫的使用

Re庫是python的標準庫,主要用於字串匹配,呼叫方法:import re

2.1. 正規表示式字串的型別

re庫採用raw string型別來表示正規表示式,表示為
r`text`
raw string是不包含對轉義符的再次轉義的字串,總而言就是string會對字元轉義,而raw string不會,因為在正則表達中會出現轉義符號,所以避免繁瑣我們使用raw string

2.2. Re庫主要功能函式

  • re.search()在一個字串中搜尋正規表示式的第一個位置,返回match物件
  • re.match()從一個字串的開始位置起匹配正規表示式,返回match物件
  • re.findall()搜尋字串,以列表型別返回全部能匹配的子串
  • re.split()將一個字串按照正規表示式匹配結果進行分割,返回列表型別
  • re.finditer()搜尋字串,返回一個匹配結果的迭代型別,每個迭代元素是match物件
  • re.sub()在一個字串中替換所有匹配正規表示式的子串,返回替換後的字串

2.2.1. re.search(pattern, string, flags=0)

在一個字串中搜尋正規表示式的第一個位置,返回match物件

  • pattern : 正規表示式的字串或原生字串表示
  • string : 待匹配字串
  • flags : 正規表示式使用時的控制標記
  • re.I re.IGNORECASE 忽略正規表示式的大小寫,[A‐Z]能夠匹配小寫字元
  • re.M re.MULTILINE 正規表示式中的^操作符能夠將給定字串的每行當作匹配開始
  • re.S re.DOTALL 正規表示式中的.操作符能夠匹配所有字元,預設匹配除換行外的所有字元

舉例說明:

import re
match = re.search(r`[1-9]d{5}`, `BIT 100081`)
if match:
    print(match.group(0))

結果為100081

2.2.2. re.match(pattern, string, flags=0)

從一個字串的開始位置起匹配正規表示式,返回match物件
引數同search函式
舉例說明:

import re
match = re.match(r`[1-9]d{5}`, `BIT 100081`)
print(match.group(0))

結果會報錯,match為空,因為match函式是
從字串開始位置開始匹配,因為從開始位置沒有匹配到,所以為空

2.2.3. re.findall(pattern, string, flags=0)

搜尋字串,以列表型別返回全部能匹配的子串
引數同search
舉例說明:

import re
ls=re.findall(r`[1-9]d{5}`, `BIT100081 TSU100084`)
print(ls)

結果為[`100081`, `100084`]

2.2.4. re.split(pattern, string, maxsplit=0, flags=0)

將一個字串按照正規表示式匹配結果進行分割返回列表型別

  • maxsplit : 最大分割數,剩餘部分作為最後一個元素輸出

舉例說明 :

import re
re.split(r`[1-9]d{5}`, `BIT100081 TSU100084`)
結果[`BIT`, ` TSU`, ` `]
re.split(r`[1-9]d{5}`, `BIT100081 TSU100084`, maxsplit=1)
結果[`BIT`, ` TSU100081`]

2.2.5. re.finditer(pattern, string, maxsplit=0, flags=0)

搜尋字串,返回一個匹配結果的迭代型別,每個迭代元素是match物件
引數同search
舉例說明 :

import re
for m in re.finditer(r`[1-9]d{5}`, `BIT100081 TSU100084`):
    if m:
        print(m.group(0))
結果為
100081
100084

2.2.6. re.sub(pattern, repl, string, count=0, flags=0)

在一個字串中替換所有匹配正規表示式的子串返回替換後的字串

  • repl : 替換匹配字串的字串
  • count : 匹配的最大替換次數

舉例說明:

import re
re.sub(r`[1-9]d{5}`, `:zipcode`, `BIT100081 TSU100084`)
結果為
`BIT:zipcode TSU:zipcode`

2.3 Re庫的另一種等價用法(物件導向)

rst=re.search(r`[1-9]d{5}`, `BIT 100081`)
函式式的呼叫,一次性操作
pat=re.compile(r`[1-9]d{5}`)
rst=pat.search(`BIT 100081`)
編譯後多次操作

regex=re.complie(pattern,flags=0)
regex也有以上六種用法

2.4 Re庫的Match物件

Match物件是是一次匹配的結果,包含匹配的很多資訊

以下是Match物件的屬性

  • .string 待匹配的文字
  • .re 匹配時使用的patter物件(正規表示式)
  • .pos 正規表示式搜尋文字的開始位置
  • .endpos 正規表示式搜尋文字的結束位置

以下是Match物件的方法

  • .group(0) 獲得匹配後的字串
  • .start() 匹配字串在原始字串的開始位置
  • .end() 匹配字串在原始字串的結束位置
  • .span() 返回(.start(), .end())

2.5 Re庫的貪婪匹配和最小匹配

當正規表示式可以匹配長短不同的多項時,返回哪一個呢?Re庫預設採用貪婪匹配,即返回匹配最長的子串

最小匹配

  • *? 前一個字元0次或無限次擴充套件,最小匹配
  • +? 前一個字元1次或無限次擴充套件,最小匹配
  • ?? 前一個字元0次或1次擴充套件,最小匹配
  • {m,n}? 擴充套件前一個字元m至n次(含n),最小匹配

只要長度輸出可能不同的,都可以通過在操作符後增加?變成最小匹配

相關文章