Re(正則表達(dá)式)庫(kù)

1 正則表達(dá)式的概念

[regular expression, regex, RE],正則表達(dá)式是對(duì)字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個(gè) “規(guī)則字符串”,這個(gè) “規(guī)則字符串” 用來表達(dá)對(duì)字符串的一種過濾邏輯。正則表達(dá)式語法由字符和操作符構(gòu)成。

  • 正則表達(dá)式是用來簡(jiǎn)潔表達(dá)一組字符串的表達(dá)式
  • 正則表達(dá)式是一種通用的字符串表達(dá)框架
  • 正則表達(dá)式是一種針對(duì)字符串表達(dá)“簡(jiǎn)潔”和“特征”思想的工具
  • 正則表達(dá)式可以用來判斷某字符串的特征歸屬

正則表達(dá)式的用途

正則表達(dá)式在文本處理中十分常用, 最主要應(yīng)用在字符串匹配中
a)表達(dá)文本類型的特征(病毒、入侵等)
b)同時(shí)查找或替換一組字符串
c)匹配字符串的全部或部分

2 正則表達(dá)式的語法

正則表達(dá)式的常用操作符

正則表達(dá)式語法實(shí)例

經(jīng)典正則表達(dá)式實(shí)例:

^[A-Za-z]+$                         由26個(gè)字母組成的字符串
^[A-Za-z0-9]+&                      由26個(gè)字母和數(shù)字組成的字符串
^-?\d+$                             整數(shù)形式的字符串
^[0-9]*[1-9][0-9]*$                 正整數(shù)形式的字符串
[1-9] \d{5}                         中國(guó)境內(nèi)郵政編碼,6位
[\u4e00-\u9fa5]                     匹配中文字符
\d{3}-\d{8}|\d{4}-\d{7}             國(guó)內(nèi)電話號(hào)碼
匹配IP地址的正則表達(dá)式(IP地址分為4段,每段0~255)
0 – 99:[1-9]?d                      100 – 199:1\d{2}
200 – 249:2[0-4] \d                 250 – 255:25[0-5]
(([1-9]? \d | 1\d{2} | 2[0-4] \d | 25[0-5] ).) {3} ( [1-9]? \d | 1\d{2} | 2[0-4] \d | 25[0-5])

3 Re庫(kù)的基本使用

Re 庫(kù)是 Python 的標(biāo)準(zhǔn)庫(kù),主要用于字符串匹配
調(diào)用方式:import re
raw string 類型(原生字符串類型)
?re 庫(kù)采用 raw string 類型表示正則表達(dá)式,表示為 r’text’
?例如:r’[1-9]\d{5}’
????r’ \d{3}- \d{8}| \d{4}- \d{7}’
?raw string 是不包含轉(zhuǎn)義符的字符串
string 類型,更繁瑣。
?例如:’[1-9] \\d{5}’
????’\\d{3}-\\d{8}| \\{4}-\\d{7}’
建議:當(dāng)正則表達(dá)式包含轉(zhuǎn)義符時(shí),使用 raw string

Re庫(kù)主要功能函數(shù)

re.search(pattern, string, flags = 0)
  • pattern:正則表達(dá)式的字符串或原生字符串表示
  • string:待匹配字符串
  • flags:正則表達(dá)式使用時(shí)的控制標(biāo)記
re.match(pattern, string, flags = 0)
  • pattern:正則表達(dá)式的字符串或原生字符串表示
  • string:待匹配字符串 -flags:正則表達(dá)式使用時(shí)的控制標(biāo)記

re.match 嘗試從字符串的起始位置匹配一個(gè)模式,如果不是起始位置匹配成功的話,match() 就返回 None。re.match 只匹配字符串的開始,如果字符串開始不符合正則表達(dá)式,則匹配失敗,函數(shù)返回 None,而 re.search 匹配整個(gè)字符串,直到找到一個(gè)匹配。

re.findall(pattern, string, flags = 0)
  • pattern:正則表達(dá)式的字符串或原生字符串表示
  • string:待匹配字符串 -f1ags:正則表達(dá)式使用時(shí)的控制標(biāo)記

注意:match 和 search 是匹配一次,findall 匹配所有。

re.split(pattern, string, maxsplit = 0, flags = 0)
  • pattern:正則表達(dá)式的字符串或原生字符串表示
  • string:待匹配字符串
  • maxsplit:最大分割數(shù),剩余部分作為最后一個(gè)元素輸出
  • flags:正則表達(dá)式使用時(shí)的控制標(biāo)記
re.finditer(pattern, string, flags = 0)
  • pattern:正則表達(dá)式的字符串或原生字符串表示
  • string:待匹配字符串 -f1ags:正則表達(dá)式使用時(shí)的控制標(biāo)記
re.sub(pattern, repl, string, count=0,flags = 0)
  • pattern:正則表達(dá)式的字符串或原生字符串表示
  • repl:替換匹配字符串的字符串
  • string:待匹配字符串
  • count:匹配的最大替換次數(shù)
  • flags:正則表達(dá)式使用時(shí)的控制標(biāo)記

Re 庫(kù)的另一種等價(jià)用法

regex = re.compile(pattern, flags = 0)

將正則表達(dá)式的字符串形式編譯成正則表達(dá)式對(duì)象

  • pattern:正則表達(dá)式的字符串或原生字符串表示
  • flags:正則表達(dá)式使用時(shí)的控制標(biāo)記
# Compile a regular expression pattern, returning a pattern object.

從 compile() 函數(shù)的定義中,可以看出返回的是一個(gè)匹配對(duì)象,它單獨(dú)使用沒有任何意義,需要和 re 庫(kù)的其它方法搭配使用。以 search 為例,利用 compile 函數(shù)可以不需要再調(diào)用 re.search(),而可以直接regex.search()。compile 函數(shù)用于編譯正則表達(dá)式,生成一個(gè)正則表達(dá)式(Pattern)對(duì)象

4 Re 庫(kù)的 Match 對(duì)象

Match 對(duì)象是一次匹配的結(jié)果,包含匹配的很多信息。

Match對(duì)象的方法

5 Re庫(kù)的貪婪匹配和最小匹配

同時(shí)匹配長(zhǎng)短不同的多項(xiàng),返回哪一個(gè)呢?

Re庫(kù)默認(rèn)采用貪婪匹配,即輸出匹配最長(zhǎng)的子串。

如何輸出最短的子串呢?

最小匹配操作符

只要長(zhǎng)度輸出可能不同的,都可以通過在操作符后增加 ? 變成最小匹配。


正則表達(dá)式相關(guān)補(bǔ)充
(1)數(shù)量詞的貪婪模式與非貪婪模式
正則表達(dá)式通常用于在文本中查找匹配的字符串。Python 里數(shù)量詞默認(rèn)是貪婪的(在少數(shù)語言里也可能是默認(rèn)非貪婪),總是嘗試匹配盡可能多的字符;非貪婪的則相反,總是嘗試匹配盡可能少的字符。例如:正則表達(dá)式 ”ab*” 如果用于查找 ”abbbc”,將找到 ”abbb”。而如果使用非貪婪的數(shù)量 詞 ”ab*?”,將找到 ”a”。注:我們一般使用非貪婪模式來提取。

(2)反斜杠問題
與大多數(shù)編程語言相同,正則表達(dá)式里使用 ”\” 作為轉(zhuǎn)義字符,這就可能造成反斜杠困擾。假如你需要匹配文本中的字符 ” \”,那么使用編程語言表示的正則表達(dá)式里將需要 4 個(gè)反斜杠 ” \\\\”:前兩個(gè)和后兩個(gè)分別用于在編程語言里轉(zhuǎn)義成反斜杠,轉(zhuǎn)換成兩個(gè)反斜杠后再在正則表達(dá)式里轉(zhuǎn)義成一個(gè)反斜杠。Python 里的原生字符串很好地解決了這個(gè)問題,這個(gè)例子中的正則表達(dá)式可以使用 r” \\” 表示。同樣,匹配一個(gè)數(shù)字的 ”\\d” 可以寫成 r”\d”。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容