零基礎到進階,Python正則表達式詳解

零基礎到進階,Python正則表達式詳解

1. 正則表達式基礎

1.1. 簡單介紹

正則表達式並不是Python的一部分。正則表達式是用於處理字符串的強大工具,擁有自己獨特的語法以及一個獨立的處理引擎,效率上可能不如str自帶的方法,但功能十分強大。得益於這一點,在提供了正則表達式的語言裡,正則表達式的語法都是一樣的,區別只在於不同的編程語言實現支持的語法數量不同;但不用擔心,不被支持的語法通常是不常用的部分。如果已經在其他語言裡使用過正則表達式,只需要簡單看一看就可以上手了。

下圖展示了使用正則表達式進行匹配的流程:

零基礎到進階,Python正則表達式詳解

正則表達式的大致匹配過程是:依次拿出表達式和文本中的字符比較,如果每一個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。如果表達式中有量詞或邊界,這個過程會稍微有一些不同,但也是很好理解的,看下圖中的示例以及自己多使用幾次就能明白。

下圖列出了Python支持的正則表達式元字符和語法:

零基礎到進階,Python正則表達式詳解

1.2. 數量詞的貪婪模式與非貪婪模式

正則表達式通常用於在文本中查找匹配的字符串。Python裡數量詞默認是貪婪的(在少數語言裡也可能是默認非貪婪),總是嘗試匹配儘可能多的字符;非貪婪的則相反,總是嘗試匹配儘可能少的字符。例如:正則表達式"ab*"如果用於查找"abbbc",將找到"abbb"。而如果使用非貪婪的數量詞"ab*?",將找到"a"。

1.3. 反斜槓的困擾

與大多數編程語言相同,正則表達式裡使用""作為轉義字符,這就可能造成反斜槓困擾。假如你需要匹配文本中的字符"",那麼使用編程語言表示的正則表達式裡將需要4個反斜槓"\\\":前兩個和後兩個分別用於在編程語言裡轉義成反斜槓,轉換成兩個反斜槓後再在正則表達式裡轉義成一個反斜槓。Python裡的原生字符串很好地解決了這個問題,這個例子中的正則表達式可以使用r"\"表示。同樣,匹配一個數字的"\\d"可以寫成r"\d"。有了原生字符串,你再也不用擔心是不是漏寫了反斜槓,寫出來的表達式也更直觀。

1.4. 匹配模式

正則表達式提供了一些可用的匹配模式,比如忽略大小寫、多行匹配等,這部分內容將在Pattern類的工廠方法re.compile(pattern[, flags])中一起介紹。

python 中的re 模塊

正則表達式

就個人而言,主要用它來做一些複雜字符串分析,提取想要的信息

學習原則:夠用就行,需要的時候在深入

現總結如下:

正則表達式中特殊的符號:

"." 表任意字符

"^ " 表string起始

"$" 表string 結束

“*” “+” “?” 跟在字符後面表示,0個——多個, 1個——多個, 0個或者1個

*?, +?, ?? 符合條件的情況下,匹配的儘可能少//限制*,+,?匹配的貪婪性

{m} 匹配此前的字符,重複m次

{m,n} m到n次,m,n可以省略

舉個例子 ‘a.*b’ 表示a開始,b結束的任意字符串

a{5} 匹配連續5個a

[] 表一系列字符 [abcd] 表a,b,c,d [^a] 表示非a

| A|B 表示A或者B , AB為任意的正則表達式 另外|是非貪婪的如果A匹配,則不找B

(…) 這個括號的作用要結合實例才能理解, 用於提取信息

/d [0-9]

/D 非 /d

/s 表示空字符

/S 非空字符

/w [a-zA-Z0-9_]

/W 非 /w

一:re的幾個函數

1: compile(pattern, [flags])

根據正則表達式字符串 pattern 和可選的flags 生成正則表達式 對象

生成正則表達式 對象(見二)

其中flags有下面的定義:

I 表示大小寫忽略

L 使一些特殊字符集,依賴於當前環境

M 多行模式 使 ^ $ 匹配除了string開始結束外,還匹配一行的開始和結束

S “.“ 匹配包括‘/n’在內的任意字符,否則 . 不包括‘/n’

U Make /w, /W, /b, /B, /d, /D, /s and /S dependent on the Unicode character properties database

X 這個主要是表示,為了寫正則表達式,更可毒,會忽略一些空格和#後面的註釋

其中S比較常用,

應用形式如下

import re

re.compile(……,re.S)

2: match(pattern,string,[,flags])

讓string匹配,pattern,後面分flag同compile的參數一樣

返回MatchObject 對象(見三)

3: split( pattern, string[, maxsplit = 0])

用pattern 把string 分開

>>> re.split('/W+', 'Words, words, words.')

['Words', 'words', 'words', '']

括號‘()’在pattern內有特殊作用,請查手冊

4:findall( pattern, string[, flags])

比較常用,

從string內查找不重疊的符合pattern的表達式,然後返回list列表


分享到:


相關文章: