首先複習一下上次說的内容
import re
# 将比對的數字乘以 2
def double(matched):
value = int(matched.group('value'))
return str(value * )
s = 'M23G4HFR567'
print(re.sub('(?P<value>\d+)', double, s))
怎麼了解上面的呢,其實這裡面的三個參數是這樣了解,在
re.sub
中根據
S
這個規則去比對,每比對成功一次,調用一次double這個函數,并把matched參數傳過去,也就是比對成功的傳回值 result = re.match(……)就是這裡的result, 然後通過group分組擷取vaule的值,可以将這段代碼複制下來運作一下
'(?P<value>\d+)'
compile
有些地方我們經常遇到 re.compile(參數1, 參數2)這種寫法,這個方法其實就是為了生成一個正規表達式的對象,這個函數裡面包含兩個參數
- 1,參數表示一個字元串形式的正規表達式
- 2:可選參數,輔助參數
- re.I 忽略大小寫
- re.L 表示特殊字元集 \w \W \b \b \s \S
- re.M 多行模式
- re.S 表示包括換行符在内的任意字元 ( .不包括換行符)
- re.U表示特殊字元集
使用說明
# re.I 表示忽略大小寫
pattern = re.compile("([a-z]+) ([a-z]+)",re.S)
m = pattern.match('jsd fk5343adsadasd33543')
print(m.group())
以上也就是基本的介紹了
這裡補充一點,其實match有一個使用方法之前還沒有介紹
findall 使用
findall是在相關的字元串中進行查找,傳回一個清單。如果沒有比對到任何一個字元串,則傳回一個空的清單,match是比對一次, findall是比對所有。
# re.S 表示包括換行符在内的所有字元
pattern = re.compile("\d+", re.S)
result = pattern.findall("abd12asnd5asd55ad44")
print(result)
# 列印結果: ['12', '5', '55', '44']
finditer
這個方法其實和findall很類似的一個方法,他比對後将傳回一個疊代器,需要使用者去周遊
result = re.finditer(r"\d+", "abd12235asnd5asd55ad44")
for it in result:
print(it.group())
# 列印結果:
# '12',
# '5',
# '55',
# '44'
re.split的使用
res = re.split('\W+', 'runoob, runoob, runoob.')
print(res)
# 列印結果
# ['runoob', 'runoob', 'runoob', '']
# 很奇怪為什麼會顯示這樣結果呢,這麼會有一個空的字元串呢
其實在這裡我們可以想象一把菜刀在兩個逗号和一個點号中間切一刀,這樣出來的結果就會出來一個空的元素
- 如果出現第三個參數則表示切割多少次,例如(‘\W+’, ‘runoob, runoob, runoob.’, 1),這裡的1表示切割一次
- 如果第四個參數存在則表示是否區分大小寫,特殊字元等參數,和上面的參數功能一緻
執行個體 | 描述 |
---|---|
. | 比對除 “\n” 之外的任何單個字元。要比對包括 ‘\n’ 在内的任何字元,請使用象 ‘[.\n]’ 的模式。 |
\d | 比對一個數字字元。等價于 [0-9]。 |
\D | 比對一個非數字字元。等價于 [^0-9]。 |
\s | 比對任何空白字元,包括空格、制表符、換頁符等等。等價于 [ \f\n\r\t\v]。 |
\S | 比對任何非空白字元。等價于 [^ \f\n\r\t\v]。 |
\w | 比對包括下劃線的任何單詞字元。等價于’[A-Za-z0-9_]’。 |
\W | 比對任何非單詞字元。等價于 ‘[^A-Za-z0-9_]’。 |
這些常用的我們必須要掌握