正規表示式學習筆記 python

2021-10-05 22:29:10 字數 4839 閱讀 8844

import re

re.findall(pattern, string, flags=0)

pattern 指的是,正規表示式匹配規則

string  指的是,要進行匹配的字串

flags   指的是,可選引數,進行特定條件的匹配,如能讓匹配時不區分大小寫的re.i和能讓元字元.匹配\n的re.s

match_str = 'bac | bbc | bcc | bdc | bec'

字符集print(re.findall('b[ce]c',match_str))

取反print(re.findall('b[^ce]c',match_str))

精簡形式

print(re.findall('b[a-d]c',match_str))

取反print(re.findall('b[^a-d]c',match_str))

match_str = '&a0b12c344d55&ac_'

常見元字元--匹配數字

print(re.findall('\d',match_str))

print(re.findall('\d\d',match_str))

取反print(re.findall('\d',match_str))

單詞字元,字母數字下劃線

match_str = '&a0b12c344d55&ac_'

print(re.findall('\w',match_str))

取反print(re.findall('\w',match_str))

空白字元

match_str = '\r\t&a0b12c344d55&ac_ \n'

print(re.findall('\s',match_str))

取反print(re.findall('\s',match_str))

數量詞,限定匹配次數{}

match_str = '&a0b12c344d55&ac_678911'

print(re.findall('\d',match_str))

match_str2 = 'lemon12banana34pear56'

pat='[a-z]'

print(re.findall(pat,match_str2))

print(re.findall('[a-z]',match_str2))

貪婪與非貪婪   ?按最小長度匹配,預設最大長度

match_str = 'lemon12banananan34pear56'

print(re.findall('[a-z]',match_str))

print(re.findall('[a-z]?',match_str))

次數匹配

?  代表匹配前面的字元零次或一次  

*  代表匹配前面的字元零次或多次  

+  代表匹配前面的字元一次或多次  

match_str = 'lemo123 lemon345 lemonnnn567'

print(re.findall('lemon*',match_str))

print(re.findall('lemon+',match_str))

print(re.findall('lemon?',match_str))

對於 ? 總結

1.如果數量詞後面有 ?即{}後有?,該 ? 代表非貪婪的關鍵字,傾向於取最小長度匹配

2.如果字元 後面有 ?,該 ? 代表匹配前面字元 0次或1次

自己練習次數匹配1

match_str = 'lemon12ba3le4leaderleadinglabornananan34pear56'

print(re.findall('le[a-z]?',match_str))                2---3位,從第2位開始的字元都要在a-z內

print(re.findall('le[a-z]*',match_str))                2---無數字,從第三位開始的字元都要在a-z內

print(re.findall('le[a-z]+',match_str))                3---無數字,從第3位開始的字元都要在a-z內

print(re.findall('le[a,b,c,d,e,f]+',match_str))        3---無數字,從第3位開始的字元都要在a-f內

自己練習次數匹配2

match_str = 'lemon12ba3le4leaderleadinglabornananan34pear56'

print(re.findall('le[a-z]?',match_str))

print(re.findall('[a-z]?',match_str))        這說明字符集[a-z]前有字母時,匹配顯示的空我們只是看不出來而已,當刪掉字符集[a-z]前面的字母時,匹配的空一下就顯示出來了

定位符(用來匹配字串的邊界)

^匹配  字串開始的位置

$匹配  字串結尾的位置

match_str = 'abcdef 123456 abcdef 456 abc'

print(re.findall('^[a-z]*',match_str))               指定 被匹配的字串的開始位置必須是字母

match_str2 = '1abcdef 123456 abcdef 456 abc'

print(re.findall('^[a-z]*',match_str2))              被匹配的字串的開始位置不是字母,匹配不到

print(re.findall('[a-z]$',match_str))

組的匹配()

組 與 字符集 區別 :   (lemon) 匹配 lemon 這一組字元 ; [lemon] 匹配 括號中的任意乙個字母

print(re.findall('(lemon)',match_str))              findall進行組的匹配時會降重

print(    re.search('(lemon)',match_str).group()   )

.  re.i  re.s  可選引數

match_str = 'lemon\n lemon\n'

print(re.findall('.',match_str))                      .能匹配除「\n」之外的任何單個字元

print(re.findall('.',match_str,re.s))                 能讓元字元.匹配\n的re.s

print(re.findall('(lemon.)',match_str,re.s|re.i))     能讓匹配時不區分大小寫的re.i和能讓元字元.匹配\n的re.s

re.findall 搜尋整個字串,返回所有匹配項。

re.search  搜尋整個字串,若匹配則返回第乙個匹配物件,若全都不匹配,則返回none。

re.match   從字串首字元開始匹配,若首字元不匹配,則返回none,若匹配則返回第乙個匹配物件。

match_str = 'a5678 lemon 1234'

match_str2='a5678 lemon 1234'

print(re.findall('\d',match_str))

print(re.search('\d',match_str2).group())

print(re.match('\d',match_str2))                     匹配成功後,注意成功後,可以用.group()檢視物件

group組匹配

group(0) 記錄的是完整匹配的結果

用 () 來表示其中的內容屬於乙個分組

需求:pat1='life(.*)sad'

r1=re.findall(pat1,match_str)         返回待匹配的內容

print(r1)

pat2='life(.*),but(.*)sad'

r2=re.search(pat2,match_str)

print(r2.group(0))                      整句話

print(r2.group(1))                      第一組

print(r2.group(2))                      第二組

print(r2.groups())                      所有組

re.sub(pattern, repl, string, count=0, flags=0)

pattern 正規表示式

repl    要替換的內容,也可傳入函式

string  被替換的字串

count   預設為0,代表全部替換 。

1 代表替換1次,

2 代表替換2次,以此類推

需求:將lemon 全都轉為 a

print(re.sub('lemon','a',match_str,count=0))

需求 xx:數字 小於 7的,都轉為 0 , 數字 大於等於 7的,都轉為 10

def transfer(value):

match_num=value.group()

print(match_num)

if int(match_num)<7:

return'0'

return'10'

print(re.sub('\d',transfer,match_str,count=0))

自己練習,把**號碼的中間四位換為*號

telephone='13152498967;13545689962;18809872345'

pat='\d\d\d'

print(re.findall(pat,telephone))

python正規表示式 學習筆記

正規表示式不僅僅適用於python,而且在其他語言中也是很重要的一部分,本文旨在讓python小白對於正規表示式有乙個整體的認識和體驗。什麼是正規表示式?它是嵌入python的微小的 高度專業化的語言 它是處理字串的強大工具。正規表示式能幹什麼?它能對字串進行匹配 切割 替換 獲取。什麼是元字元?特...

python正規表示式學習筆記

正規表示式是乙個特殊的字串行,它能幫助你方便的檢查乙個字串是否與某種模式的匹配 re.mach嘗試從字串的起始位置匹配乙個模式,如果不是起始位置匹配成功的話,match 就返回none.函式語法 re.match pattern,string,flads 0 函式引數說明 匹配的正規表示式 patt...

Python 正規表示式筆記

python 正規表示式筆記 正規表示式的先行斷言 lookahead 和後行斷言 lookbehind 正規表示式的先行斷言和後行斷言一共有4種形式 pattern 零寬正向先行斷言 zero width positive lookahead assertion pattern 零寬負向先行斷言 ...