柚子快報(bào)邀請碼778899分享:正則表達(dá)式學(xué)習(xí)筆記
柚子快報(bào)邀請碼778899分享:正則表達(dá)式學(xué)習(xí)筆記
正則表達(dá)式
正則匹配函數(shù)簡單的模式:字符匹配2.1 元字符2.2 概括字符集2.3 數(shù)量詞2.4 邊界匹配 ^和$2.5 組 ( )2.6 匹配模式參數(shù)2.7 re.sub替換字符串2.8 把函數(shù)做為參數(shù)傳遞2.9 group分組
正則表達(dá)式的一些建議
正則匹配函數(shù)
1.1 re.compile re.compile是將正則表達(dá)式轉(zhuǎn)換為模式對象,這樣可以更有效率匹配。 單獨(dú)使用就沒有任何意義,需要和findall(), search(), match()搭配使用。 1.2 re.match 從字符串的第一個(gè)字符開始匹配,未匹配到返回None,匹配到則返回一個(gè)對象 1.3 re.search 搜索整個(gè)字符串第一個(gè)匹配到指定的字符則返回值,未匹配到則返回None。 1.4 re.findall 匹配出字符串中所有跟指定值有關(guān)的值,并且以列表的形式返回。 未匹配到則返回一個(gè)空的列表。
import re
# compile配合findall
a = '0355-67796666'
b = re.compile(r'\d+-\d{8}')
r = re.findall(b,a)
# 或
r = b.findall(a)
print(r)
# 直接使用findall
import re
r = re.findall(r'\d+-\d{8}',a)
print(r)
# compile配合search
import re
正則 = re.compile(r'\d+-\d{8}')
r = re.search(正則,a)
print(r.group())
# compile配合match
import re
正則 = re.compile(r'\d+-\d{8}')
r = re.match(正則,a)
print(r.group())
# ['0355-67796666']
# ['0355-67796666']
# 0355-67796666
# 0355-67796666
簡單的模式:字符匹配
2.1 元字符
[0-9]:所有數(shù)字; [^0-9]:非數(shù)字; x[d-f]z:字符串中間字母是d,e,f的單詞
2.2 概括字符集
\d:所有的數(shù)字;\D:所有非數(shù)字; \w:可以提取中文,英文,數(shù)字和下劃線,不能提取特殊字符 \W:提取特殊字符、空格、\n、\t等
2.3 數(shù)量詞
匹配0次或無限多次—— *號(hào); 匹配1次或者無限多次 ——+號(hào); 匹配0次或1次 ——?號(hào)
# 匹配0次或無限多次 *號(hào),*號(hào)前面的字符出現(xiàn)0次或無限次
import re
a = 'exce0excell3excel3'
r = re.findall('excel*',a)
print(r)
# 匹配1次或者無限多次 +號(hào),+號(hào)前面的字符至少出現(xiàn)1次
import re
a = 'exce0excell3excel3'
r = re.findall('excel+',a)
print(r)
# 匹配0次或1次 ?號(hào),?號(hào)經(jīng)常用來去重復(fù)
import re
a = 'exce0excell3excel3'
r = re.findall('excel?',a)
print(r)
# ['exce', 'excell', 'excel']
# ['excell', 'excel']
# ['exce', 'excel', 'excel']
貪婪
# 貪婪
import re
a = 'Excel 12345Word23456PPT12Lr'
r = re.findall('[a-zA-Z]{3,5}',a)
print(r)
# 非貪婪
r = re.findall('[a-zA-Z]{3,5}?',a)
print(r)
r = re.findall('[a-zA-Z]{3}',a)
print(r)
# ['Excel', 'Word', 'PPT']
# ['Exc', 'Wor', 'PPT']
# ['Exc', 'Wor', 'PPT']
2.4 邊界匹配 ^和$
# 限制電話號(hào)碼的位置必需是8-11位才能提取
import re
tel = '13811115888'
r = re.findall('^\d{8,11}$',tel)
print(r)
# ['13811115888']
2.5 組 ( )
# 將abc打成一個(gè)組,{2}指的是重復(fù)幾次,匹配abcabc
import re
a = 'abcabcabcxyzabcabcxyzabc'
r = re.findall('(abc){2}',a)
print(r)
#['abc', 'abc']
2.6 匹配模式參數(shù)
1).re.I(re.IGNORECASE): 忽略大小寫
2).re.M(MULTILINE): 多行模式,改變’^’和’$’的行為
3).re.S(DOTALL): 點(diǎn)任意匹配模式,改變’.’的行為
4).re.L(LOCALE): 使預(yù)定字符類 \w \W \b \B \s \S 取決于當(dāng)前區(qū)域設(shè)定
5).re.U(UNICODE): 使預(yù)定字符類 \w \W \b \B \s \S \d \D 取決于unicode定義的字符屬性
6).re.X(VERBOSE): 詳細(xì)模式。這個(gè)模式下正則表達(dá)式可以是多行,忽略空白字符,并可以加入注釋
# findall第三參數(shù) re.I忽略大小寫
import re
a = 'abcFBIabcCIAabc'
r = re.findall('fbi',a,re.I)
print(r)
# 多個(gè)模式之間用 | 連接在一起
import re
a = 'abcFBI\nabcCIAabc'
r = re.findall('fbi.{1}',a,re.I | re.S) # 匹配fbi然后匹配任意一個(gè)字符包括\n
print(r)
# 注:.句號(hào),不匹配\n,但是使用re.S之后,匹配所有字符包括換行符
# ['FBI']
# ['FBI\n']
2.7 re.sub替換字符串
# 把FBI替換成BBQ
import re
a = 'abcFBIabcCIAabc'
r = re.sub('FBI','BBQ',a)
print(r)
# 把FBI替換成BBQ,第4參數(shù)寫1,證明只替換第一次,默認(rèn)是0(無限替換)
import re
a = 'abcFBIabcFBIaFBICIAabc'
r = re.sub('FBI','BBQ',a,1)
print(r)
# abcBBQabcCIAabc
# abcBBQabcFBIaFBICIAabc
2.8 把函數(shù)做為參數(shù)傳遞
# 拓展知識(shí)
import re
a = 'abcFBIabcFBIaFBICIAabc'
def 函數(shù)名(形參):
print(形參)
分段獲取 = 形參.group() # group()在正則表達(dá)式中用于獲取分段截獲的字符串,獲取到FBI
return '$' + 分段獲取 + '$'
r = re.sub('FBI',函數(shù)名,a)
print(r)
# 將字符串中大于等于5的替換成9,小于5的替換成0
import re
a = 'C52730A52730D52730'
def 函數(shù)名(形參):
分段獲取 = 形參.group()
if int(分段獲取) >= 5:
return '9'
else:
return '0'
r = re.sub('\d',函數(shù)名,a)
print(r)
#
#
#
# abc$FBI$abc$FBI$a$FBI$CIAabc
# C90900A90900D90900
2.9 group分組
import re
a = "123abc456"
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(0)) #123abc456,返回整體
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(1)) #123
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(2)) #abc
print(re.search("([0-9]*)([a-z]*)([0-9]*)",a).group(3)) #456
import re
a = 'life is short,i use python,i love python'
r = re.search('life(.*)python(.*)python',a)
print(r.group(0)) # 完整正則匹配
print(r.group(1)) # 第1個(gè)分組之間的取值
print(r.group(2)) # 第2個(gè)分組之間的取值
print(r.group(0,1,2)) # 以元組形式返回3個(gè)結(jié)果取值
print(r.groups()) # 返回就是group(1)和group(2)
# 123abc456
# 123
# abc
# 456
# life is short,i use python,i love python
# is short,i use
# ,i love
# ('life is short,i use python,i love python', ' is short,i use ', ',i love ')
# (' is short,i use ', ',i love ')
正則表達(dá)式的一些建議
常用的正則表達(dá)式,不用自己寫,在百度上搜索常用正則表達(dá)式如果內(nèi)置方法可以快速解決問題,建議不要化簡為繁
柚子快報(bào)邀請碼778899分享:正則表達(dá)式學(xué)習(xí)筆記
參考文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。