學習正規表示式在python中的應用

2021-09-20 23:42:19 字數 4919 閱讀 1380

目的:對文字的處理,正規表示式的功能很強大,可以很巧妙的過濾、匹配、獲取想要的字串,是必須學習的技能,這裡只記錄常用的寫法,詳細文件可以參看官方幫助文件。

環境:ubuntu 16.04    python 3.5

在python中使用正規表示式首先要匯入re模組

1

importre

在re模組中有幾個常用的函式:

re.compile('value')

它會返回乙個正規表示式regex物件,作用是對預編譯提速,且第二個引數支援一些方法,把它返回給乙個變數方便重複使用,函式有兩個引數:匹配表示式和第二個可選引數:

最簡單的匹配:r'haha'匹配字元'haha',但不匹配'hehe',可以使用萬用字元,下面介紹:

常用萬用字元:

\d表示乙個數字

\w表示字母、數字、下劃線中任意乙個,且在python3中支援匹配乙個漢字。

\s表示空格、製表符和換行中任意乙個。

\d, \w, \s是他們的非模式。

^匹配字串起始位置,當^在方括號內是表示非模式,[^a-z]小寫26個字母以外。

$匹配字串結尾位置。

\b表示乙個字元旁空格的位置,'it is a good job', \bgoog\b匹配good,而不會匹配goods等其他。

| 豎槓表示或,如\d|\d,匹配乙個數字或兩個數字。

自定義萬用字元:

[a-z]表示小寫a到z的26個字母中任意乙個

中括號模式可以包含很多,比如:[a-za-z0-9_]這個就是\w(只在python2中相等),還可以想這樣[aeiou]只包含想要匹配的,或者特殊符號[._-],需要轉義的要加上\。

以上都是只匹配符合的乙個,下面學習數量:

匹配最少: 表示5次,表示1次到5次都可以,省略後面的表示至少1次。

貪婪匹配:+等同於,*表示可無或更多,?表示一次或更多,.點表示就是\s,這裡都會匹配多的結果,因為是貪婪模式。

限制貪婪:在貪婪模式後面加上?表示限制貪婪,匹配最少,+會盡量匹配多的,+?匹配乙個。

1

2

numregex=re.compile(r'\d')

# 生成匹配11位數字的正則物件,\d是數字,代表11次

re.compile()的第二個引數有:re.verbose, re.ignorecase和re.dotall,後面要大寫。

re.verbose表示匹配中可以多行且有注釋,在複雜的正則物件中使用。

1

2

3

4

re.compile(r'''(

\d        #匹配乙個數字

\w        #匹配乙個字元

)''', re.verbose)

re.igorecase表示匹配不區分大小寫:

1

re.compile(r'[a-z]', re.igorecase)

這個即可以匹配a,也可以匹配a。

re.dotall表示允許.匹配包括\s的內容

1

re.compile(r'.*', re.dotall)

匹配所以內容。

匹配方法:search(), match(), findall(), finditer()

這些是匹配規則查詢方法,也可以直接把正規表示式寫在他們的第乙個引數的位置(測試時可以,正式編寫不推薦,理由在上面的compile中)而不用compile(),第二個引數是需要匹配的字串,如

1

re.search(r'\d+','aa123abc')

返回123

search()方法

search()方法進行全字元搜尋,返回的是第乙個符合條件的match物件,並且它只返回乙個,即使後面有其他符合條件的,也不處理,沒有則返回none。

1

2

aa=re.compile(r'\d\d\d+')

bb=aa.search('aa12345abc678')

bb得到返回的包含12345的match物件,而沒有678

match()方法

match()方法從字串開始處就匹配,且只返回乙個符合條件的match物件,相當於正規表示式以r'^開始,匹配也只返回開始部分,沒有則返回none。

1

2

aa=re.compile(r'\d+')

bb=aa.search('123ab45')

bb得到返回的包含123的match物件,沒有45,且如果字串變成'a123ab45',則返回none。

findall()方法

findall()方法進行全字元搜尋,返回所有符合條件的值,然後組成列表,即返回乙個列表物件,沒有則為空列表。

1

2

aa=re.compile(r'\d+')

bb=aa.findall('a123b45c678')

bb得到返回的的列表['123', '45', '678']

finditer()方法

finditer()方法進行全字串搜尋,返回所有符合條件的match物件,然後組成迭代器,用for方法可以看出迭代器裡面是match物件。

這裡match物件有group(), group(index)和groups()方法

可使用它們呼叫返回的match物件,group()和group(0)都是得到母值,groups()返回所有group(index)組成的元組。

分組和捕獲

在正規表示式中使用圓括號()會產生分組,每個組都是元素,返回乙個元組物件,可用group()獲取對於序號的元素:

1

numregex=re.compile(r'(\d)(\d)(\d)')

當圓括號內左邊使用?:表示不分組、不捕獲,如:(?:\d)匹配但不分組也不捕獲,不捕獲則不生成match物件。

替換方法sub():

上面已經學習了查詢,這個是替換方法,有兩種常用方式,我稱為全部隱藏替換和部分隱藏替換:

全部隱藏替換:

1

2

aa=re.compile(r'engineer (\w)\w+')

bb=aa.sub(r'xx',)

部分隱藏替換:

1

2

aa=re.compile(r'engineer (\w)\w+')

cc=aa.sub(r'\1**',)

常用的正規表示式舉例:

r'0\d-\d'      匹配固定**,如:0755-87226688,010-85332765

Python 正規表示式學習(二)正規表示式語法

一,單一字元匹配 1 匹配任意字元 import re res re.match r a.abcd print res.group 列印結果 abc一點.表示匹配任意的字元。上面的 表示匹配a後面的任意兩個字元。必須從a開始。若寫成 b.則會發生錯誤。2 匹配指定字元 如 0 9a za z 表示 ...

python正規表示式學習

今天學習了python中有關正規表示式的知識。關於正規表示式的語法,不作過多解釋,網上有許多學習的資料。這裡主要介紹python中常用的正 則表示式處理函式。re.match 嘗試從字串的開始匹配乙個模式,如 下面的例子匹配第乙個單詞。import re text jgood is a handso...

python正規表示式學習

python 中的re 模組 正規表示式 就個人而言,主要用它來做一些複雜字串分析,提取想要的資訊 學習原則 夠用就行,需要的時候在深入 現總結如下 正規表示式中特殊的符號 表任意字元 表string起始 表string 結束 跟在字元後面表示,0個 多個,1個 多個,0個或者1個 符合條件的情況下...