文章目錄
- 正規表達式
-
- 元字元
-
- 字元比對
- 比對次數
- 位置錨定
- 分組
-
- 特殊分組用法
- 選擇、轉義
- Perl式元字元
- re子產品常用方法
-
- 比對模式标志位
- 方法
正規表達式
正規表達式(Regular Expression,簡寫為RE,regex)是一種小型的、高度專業化的程式設計語言,在python中由内嵌的re子產品實作。正規表達式模式被編譯成一系列的位元組碼,然後由C編寫的比對引擎執行。
元字元
字元比對
- .字元:比對任意單個字元
- []:比對指定範圍内的任意單個字元
- [^]:比對指定範圍外的任意單個字元
比對次數
- *字元:比對前面的字元任意次數
- ?:比對其前面的字元0或1次
- +:比對前面的字元至少1次
- {m,n}:比對前面的字元至少m次,至多n次
位置錨定
- ^:行首錨定,用于模式的最左側
- $:行尾錨定,用于模式的最右側
分組
- ():表示将多個字元捆綁在一起作為一個整體來進行處理
特殊分組用法
- \<number>:引用編号為的分組比對到字元串,預設會采取此分組方法
import re
x = re.search("([a-z]+)(\d+)","aaa333b444").group(1)
y = re.search("([a-z]+)(\d+)","aaa333b444").group(2)
z = re.findall("([a-z]+)(\d+)","aaa333b444")
print(x)
print(y)
#
aaa
333
[('aaa', '333'), ('b', '444')] #分組後傳回的值會被包含在清單中
- (?P<name>):分組,除了原有的編号外再指定一個額外的别名,使用(?P=name),可以引用分組内容。
import re
x = re.search("(?P<alp>[a-z]+)(\d+)","aaa333b444").group("alp")
# 将第一個分組的名字定為“alp”
print(x)
#
aaa
選擇、轉義
- |:表示比對管道符左右兩側任意一側
- \: 表示将後面的字元轉化為普通字元或者特殊意義字元
關于轉義字元在python中的注意的點:比如’\b’這個字元串在python中本來的意思為倒退,而需要使用re元字元的意義,比對模式需要加一層轉義,‘\\b’;而如果’\b’作為一個普通字元串進行比對的時候需要這麼搜尋,re.findall(’\\\\b’,‘xxx\bx’)。
Perl式元字元
- \d:表示比對任一數字,相當于[0-9]
- \D:表示比對任一非數字,相當于[^0-9]
- \s:表示比對任一空白字元,相當于[\t\n\r\f\v]
- \S:表示比對任一非空白字元,相當于[^\t\n\r\f\v]
- \w:表示比對任何字母數字字元
- \W:表示比對任何非字母數字字元
- \b:比對一個特殊字元邊界,比如空格,&,#等
re子產品常用方法
比對模式标志位
- re.I 忽略大小寫
- re.L 表示特殊字元集 \w, \W, \b, \B, \s, \S 依賴于目前環境
- re.M 多行模式
- re.S 即為 . 比對并且包括換行符在内的任意字元(. 不包括換行符)
- re.U 表示特殊字元集 \w, \W, \b, \B, \d, \D, \s, \S 依賴于 Unicode 字元屬性資料庫
- re.X 為了增加可讀性,忽略空格和 # 後面的注釋
方法
-
此方法會找出所有比對的字元串,并傳回一個清單(若有分組,一比對項中的組會以元祖的形式包裹)re.findall('pattern','string')
import re
x = re.findall("[a-z]+\d+","aaa333b444")
y = re.findall("([a-z]+)(\d+)","aaa333b444")
print(x)
print(y)
#
['aaa333', 'b444']
[('aaa', '333'), ('b', '444')] #分組後傳回的值會被包含在元祖中
import re
x = re.findall("www\.(baidu|163)\.com","kasjwww.baidu.comasdsd")
y = re.findall("www\.(?:baidu|163)\.com","kasjwww.baidu.comasdsd")
print(x)
print(y)
#結果
['baidu'] #findall會優先傳回分組中的内容
['www.baidu.com'] # ?:會取消分組的優先級
-
和 findall 類似,在字元串中找到正規表達式所比對的所有子串對象,并把它們作為一個疊代器傳回re.finditer('pattern','string')
import re
x = re.finditer("[a-z]+\d+","aaa333b444")
print(next(x).group())
#結果
# aaa333
-
search,浏覽全部字元串,比對第一符合規則的字元串,比對成功會傳回一個比對對象,比對到的值儲存在group,groups,groupdict,三個對象的方法中,後兩者會比對有分組的比對中,未比對成功傳回None,flags表示比對模式标志位,具體參考上文。re.search('pattern','string',flags=0)
import re
x = re. search("[a-z]+\d+","aaa333b444")
x1 = x.group()
print(x)
print(x1)
#結果
<_sre.SRE_Match object; span=(0, 6), match='aaa333'>
aaa333
#隻會比對到第1個滿足pattern的字元串
import re
y = re.search("(?P<name>[a-z]+)(\d+)","aaa333b444")
a1 = y.groups()
a2 = y.groupdict() #會傳回字典 格式{"分組名":"str"}
print(a1)
print(a2)
#結果
('aaa', '333')
{'name': 'aaa'}
-
功能和search基本相同,不同的是match是從字元開頭開始比對,如果不是起始位置比對成功的話,match()就傳回none。re.match('pattern','string',flags=0)
import re
x = re.match("([a-z]+)(\d+)","aaa333b444")
y = re.match("([a-z]+)(\d+)","1aaa333b444")
print(x)
print(y)
#結果
<_sre.SRE_Match object; span=(0, 6), match='aaa333'>
None
-
根據正則比對的字元串進行分割,傳回分割後的清單re.split(pattern, string[, maxsplit=0, flags=0])
import re
origin = "hello alex bcd alex lge alex acd 19"
r = re.split("a", origin) #根據字元a分割字元串
print(r)
#輸出結果 ['hello ', 'lex bcd ', 'lex lge ', 'lex ', 'cd 19']
import re
origin = "hello alex bcd alex lge alex acd 19"
r = re.split("a", origin) #根據字元a分割字元串
print(r)
#輸出結果 ['hello ', 'lex bcd ', 'lex lge ', 'lex ', 'cd 19']
import re
origin = "hello alex bcd alex lge alex 2acd 19"
r = re.split("a\w+", origin) #根據“a開頭的字元串”正則比對分割字元串
print(r)
#輸出結果 ['hello ', ' bcd ', ' lge ', ' 2', ' 19']
#将比對到的字元串作為分割标準進行分割
-
用于替換字元串中的比對項,count表示替換次數,等于0表示全部替換,repl可以是一個函數re.sub(pattern, repl, string, count=0, flags=0)
import re
origin = "hello alex bcd alex lge alex acd 19"
r = re.sub("a","替換",origin) #替換比對成功的指定位置字元串
print(r)
#輸出結果
# hello 替換lex bcd 替換lex lge 替換lex 替換cd 19
-
替換比對成功的指定位置字元串,并且傳回替換次數,可以用兩個變量分别接受re.subn(pattern, repl, string, count=0, flags=0)
-
compile 函數用于編譯正規表達式,生成一個正規表達式( Pattern )對象,供用于比對字元串,将pattern變為一個對象,對批量進行比對很有好處。re.compile(pattern[, flags])
import re
origin = "hello alex bcd alex lge alex acd 19"
pattern = re.compile("a(\w+)")
r = pattern.search(origin)
print(r.group())
# 結果
# alex