python與正規表示式 re模組

2021-06-21 20:06:28 字數 4226 閱讀 6399

1. 核心筆記:查詢與匹配的比較

當我們完全討論與字串中模式有關的正規表示式時,我們會用術語"matching"(匹配),指的是術語pattern-matching(模式匹配)。在python專門術語中,有兩種主要方法完成模式匹配:搜尋(searching)和匹配(matching)。搜尋,即在字串任意部分中查詢匹配的模式;而匹配是指,判斷乙個字串能否從起始處全部或部分的匹配某個模式。搜尋通過search()函式或方法來實現,而匹配是以呼叫match()函式或方法來實現的。

2. 正規表示式使用的特殊符號和字元

記號說明

舉例literra1

匹配字串的值

foore1 | re2

匹配正規表示式re1或re2

foo|bar

.(點號)

匹配任何字元(換行符除外)

b.b^

匹配字串的開始

^dear

$匹配字串的結尾

/bin/*sh$

*匹配前面出現的正規表示式零次 或 多次

[a-za-z0-9]*

+匹配前面出現的正規表示式一次 或 多次

[a-z]+\.com

?匹配前面出現的正規表示式零次 或 一次

goo?

匹配前面出現的正規表示式n次

[0-9]

匹配重複出現m次 到 n次的正規表示式

[0-9]

[...]

匹配字元陣列裡出現的任意乙個字元

[aeiou]

[..x-y..]

匹配從字元x到y中的任意乙個字元

[0-9],[a-za-z]

[^...]

不匹配此字符集中出現的任何乙個字元

[^aeiou],[^a-za-z0-9]

(...)

匹配封閉括號中正規表示式(re),儲存為子組

[0-9]

特殊符號

\d   

匹配任何數字,和[0-9]一樣(\d是\d的反義:任何非數字符)   

data\d+.txt

\w匹配任何數字字母字元,和[a-za-z0-9]相同(\w是其反義)

[a-za-z]\w+

\s匹配任何空白符,和[\n\t\r\v\f]相同,(\s是其反義)

of\sthe

\b匹配單詞邊界(\b是其反義)

\bthe\b

\nn匹配已儲存的子組

price: \16

\c逐一匹配特殊字元c(即取消它的特殊含義,按字面匹配)

\. , \\, \*

\a(\z)

匹配字串的起始(結束)

\adear

3. (1) 用管道符號( | )匹配多個正規表示式模式

管道符號( | ), 選擇被管道符號分隔的多個不同的正規表示式中的乙個。例如,下面的一些使用或操作的模式,和它們所匹配的字串:

正規表示式模式

匹配的字串

at | home

at , home

bat | bet | bit

bat , bet , bit

(2) 匹配任意乙個單個的字元( . )

點字元或句號(.)符號匹配除換行符(newline)外的任意乙個單個字元(python 的正規表示式有乙個編譯標識 [s or dotall],該標識能 去掉 這一限制,使 ( . ) 在匹配時包括換行符(newlines)。)(這裡括號缺一半) 無論是字母、數字、不包括「\n」的空白符、可列印的字元、還是非列印字元,或是乙個符號,「點」,( . )都可以匹配他們。

正表示式模式 

匹配的字串

f.o 

在"f"和"o"中間的任何字元,如fao, f9o, f#o 等

..任意兩個字元

.end 

匹配在字串end 前面的任意乙個字元

4. python原始字串(raw strings)的用法:

原始字串的產生正是由於有正規表示式的存在。原因是ascii字元和正規表示式特殊字元間所產生的衝突。比如,特殊字元"\b"在ascii字元中代表退格鍵,但同時"\b"也是正規表示式的特殊符號,代表"匹配乙個單詞邊界"。為了讓re編譯器把兩個字元"\b"當成你想要表達的字串,而不是乙個退格鍵,你需要用另乙個反斜線對它進行轉義,即可以這樣寫"\\b"。

但是這樣做會把問題複雜化,特別是當你的正規表示式字串裡有很多特殊字元時,就更容易令人困惑了。我們可以使用原始字串,它可以用來簡化正規表示式的複雜程式。事實上,很多python程式設計師在定義正規表示式時都只使用原始字串。

下面的例子用來說明退格鍵"\b"和正規表示式"\b"(包含或不包含原始字串)之間的區別:

>>> m=re.match("\bblow","blow") #表達是退格,沒有匹配

>>> if m is not none:m.group()

...

>>> m=re.match("\\bblow","blow") #轉義後就可以匹配

>>> if m is not none:m.group()

...

'blow'

>>> m=re.match(r"\bblow","blow") #用原始字元也可以匹配

>>> if m is not none:m.group()

...

'blow'

>>>

5. 用findall找到每個出現的匹配部分

findall用於非重疊地查詢某字串中乙個正規表示式模式出現的情況。findall()與search()相似之處在於二者都執行字串搜尋,但是與search和match不同之處是findall()總返回乙個列表。如果findall()沒有找到匹配的部分,會返回空列表;如果成功找到匹配部分,則會返回所有匹配部分的列表(按從左到右出現的順序排列)

>>> re.findall('car','car')

['car']

>>> re.findall('car','scary')

['car']

>>> re.findall('car','carry the barcardi to the car')

['car', 'car', 'car']

包含字組的搜尋會返回更複雜的乙個列表,這樣做是有意義的,因為子組是允許你從單個正規表示式抽取特定模式的一種機制,比如,匹配乙個完整**號碼中的一部分(例如區號),或完整電子郵件位址的一部分(例如登入名)

正規表示式僅有乙個子組時,findall()返回子組匹配的字串組成列表;如果表示式有多個子組,返回的結果是乙個元組的列表,元組中的每個元素都是乙個子組的匹配內容,像這樣的元組(每乙個成功的匹配對應乙個元組)構成了返回列表中的元素。

import re,urllib

htmlsource = urllib.urlopen("").read(20000)

linkslist=re.findall('(.*?)',htmlsource)

#print linkslist

for link in linkslist:

print link[0]

6. python正規表示式的除錯方法:

import re

numbers=["123 555 6789","1-(123)-555-6789","123-456-6789","(123).555.6789"]

for number in numbers:

pattern=re.match(r"\d \d \d",number,re.debug) #加上re.debug就是開啟的除錯模式

if pattern:

print pattern

print pattern.group()

下面是輸出的結果:

beyond@beyond ~/code/code-python $ python debug.py 

max_repeat 3 3

incategory category_digit

literal 32

max_repeat 3 3

incategory category_digit

literal 32

max_repeat 4 4

incategory category_digit

<_sre.sre_match object at 0x7f1647b30440>

123 555 6789

python pandas 正規表示式 re模組

目錄 1 正則解說 數量詞的貪婪模式與非貪婪模式 正規表示式通常用於在文字中查詢匹配的字串。python裡數量詞預設是貪婪的 在少數語言裡也可能是預設非貪婪 總是嘗試匹配盡可能多的字元 非貪婪的則相反,總是嘗試匹配盡可能少的字元。例如 正規表示式 ab 如果用於查詢 abbbc 將找到 abbb 而...

python 正規表示式 re

match 和 search 的區別 match是從字串開頭匹配,而search是在整個字串中匹配。如 p re.compile a z p.match message none 因為開頭是 因此無法匹配 而 m p.search message print m re.matchobject ins...

python正規表示式 re

re.match 嘗試從字串的開始匹配乙個模式,如 下面的例子匹配第乙個單詞。import retext jgood is a handsome boy,he is cool,clever,and so on.m re.match r w s text ifm print m.group 0 n m...