目的:對文字的處理,正規表示式的功能很強大,可以很巧妙的過濾、匹配、獲取想要的字串,是必須學習的技能,這裡只記錄常用的寫法,詳細文件可以參看官方幫助文件。
環境:ubuntu 16.04 python 3.5
在python中使用正規表示式首先要匯入re模組
1
import
re
在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個 符合條件的情況下...