matchobj = re.match(r'(\d+)([abcd]+)'
,'12bbcxyz'
)#[abcd]表示:a或b或c或d
if matchobj:
print matchobj.groups(
)#('12', 'bbc')
print matchobj.group(
)#12bbc
print matchobj.group(1)
#12print matchobj.group(2)
#bbc
# print matchobj.group(3) #報錯indexerror: no such group
else
:print
'none match'
re.match()
方法:
引數1是正規表示式匹配模式,引數2是待匹配的原始字串;
此方法只從字串的開頭匹配,若開頭不匹配即使字串中間有子串能匹配也返回none
。如引數2換為'a12bbcxyz'
則輸出none match
。
re.search()
方法:
和match
方法引數一樣,不過可以匹配字串裡面的子串,如引數2換為'a12bbcxyz'
則輸出不變。
match
和search
兩個方法只能找到匹配引數1匹配模式的,從引數2原始字串左起的第乙個字串。若想找到所有的匹配的字串,用下面介紹的findall
方法。
若匹配成功則返回乙個匹配物件:matchobj
:
其有group(num=0)
和groups()
方法:
而group(n)(n=1、2、3…)
會返回同第n分組匹配的字串(引數1匹配模式裡的每個括號裡是乙個分組);
group()
方法有預設引數0
,group(0)
會返回同整個引數1模式匹配的字串(這個非分組);
groups()
方法返回所有分組組成的元組(若無分組返回空元組),第乙個分組的組號為1。
findres = re.findall(r'\d[a-z]'
,'1one2two'
)print findres #['1o', '2t']
findres = re.findall(r'(\d)[a-z]'
,'1one2two'
)print findres #['1', '2']
findres = re.findall(r'(\d)([a-z])'
,'1one2two'
)print findres #[('1', 'o'), ('2', 't')]
若引數1匹配模式無分組:則返回所有同整個匹配模式匹配的字串組成的列表;
若引數1有分組:若只有1個分組,則返回所有同分組匹配的字串組成的列表;若分組數大於1,則返回所有同各分組匹配的字串組成的元組的列表。
加入匹配標誌位flags
:
pattern = re.
compile
('(.*)
', re.m)
div_list = re.findall(pattern, page)
print
(div_list)
普通字串替換:
print
'abc'
.replace(
'a',
'a')
#abc
正則替換:
print re.sub(r'\d'
,'*'
,'123bbc'
, count=2)
# **3bbc count=2表示進行2次替換
print re.sub(r'\d+'
,'*'
,'123bbc'
, count=2)
# *bbc 此處只進行了1次替換
print re.sub(r'\d+?'
,'*'
,'123bbc'
, count=2)
# **3bbc 加?表示非貪婪模式:最小範圍匹配。進行了2次替換。
count
引數指定從左邊起替換幾次,預設為0
,表示全部替換;
此種情況下引數1匹配模式分組資訊無效,只會對匹配整個模式的字串進行替換。
另外sub
方法的第二個引數除了可以是字串外,還可以是替換函式:
替換函式接受的引數是匹配物件;
返回值是匹配整個模式的字串將要被替換為的內容;
count
引數決定替換函式執行的次數。
import re
defrep_f
(matchobj)
:print matchobj.group(
)print matchobj.groups(
)return matchobj.group(
'group_b'
)#使用(?p...)給分組2指定了乙個別名group_b,group函式可以接受別名引數,此處相當於group(2)
print re.sub(r'(\d+)(?pb)'
, rep_f,
'123bb234c123bbc123bbc'
, count=2)
# 輸出:
# 123b
# ('123', 'b')
# 123b
# ('123', 'b')
# bb234cbbc123bbc
import re
print re.split(r'\d+(b)'
,'123bb234c123bbc123bbc',2
)# ['', 'b', 'b234c', 'b', 'bc123bbc']
與引數1匹配模式中的分組匹配的字串,會在分割後的返回值列表中出現;
引數3指定最大分割次數,也就是最多用幾個能完整匹配引數1匹配模式的字串分割。
各個方法的原型:
re.match(pattern, string, flags=0)
#返回值:匹配物件
re.search(pattern, string, flags=0)
#返回值:匹配物件
re.findall(pattern, string, flags=0)
#返回值:list
re.sub(pattern, repl, string, count=
0, flags=0)
#返回值:str, repl
re.split(pattern, string, maxsplit=
0, flags=0)
#返回值:list
其中flags
標誌位,用於控制正規表示式的匹配方式,如:是否區分大小寫,多行匹配等等。具體的:如re.i | re.m
被設定成i
和m
標誌。
修飾符描述
re.i
使匹配對大小寫不敏感
re.l
做本地化識別(locale-aware)匹配
re.m
多行匹配,影響 ^ 和 $
re.s
使 . 匹配包括換行在內的所有字元
re.u
根據unicode字符集解析字元。這個標誌影響 \w, \w, \b, \b.
re.x
該標誌通過給予你更靈活的格式以便你將正規表示式寫得更易於理解。
python正規表示式元字元 正規表示式
字元 描述將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了 regexp 物件的 multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束...
Python 正規表示式
1.在python中,所有和正規表示式相關的功能都包含在re模組中。2.字元 表示 字串的末尾 如 road 則表示 只有當 road 出現在乙個字串的尾部時才會匹配。3.字元 表示 字元中的開始 如 road 則表示 只有當 road 出現在乙個字串的頭部時才會匹配。4.利用re.sub函式對字串...
Python正規表示式
學習python自然而然就不得不面對正規表示式這個難題。當初在沒有學習python之前,自己也曾經嘗試著學習過正規表示式,但是那時候感覺很麻煩,很難懂,結果就是不了了之。但是現在學習python我用的書是 python基礎教程 第二版 這本書中對re模組的講解很簡單易懂,內容不多但起碼把人領進門了,...