day17 - 正則表達(dá)式

1.正則表達(dá)式

1.1什么是正則表達(dá)式

正則表達(dá)式就是字符匹配的工具;是由正則符號(hào)和普通字符組成,來(lái)匹配不同規(guī)律的字符串。

1.2.python對(duì)正則表達(dá)式的支持

python中提供了一個(gè)re模塊,用來(lái)支持正則表達(dá)式。
fullmatch(正則表達(dá)式,字符串)- 用正則表達(dá)式去完全匹配字符串,如果匹配成功返回匹配結(jié)果,失敗返回None。
python中正則表達(dá)式的寫法:將正則內(nèi)容寫在字符串中,一般這個(gè)字符串的最前面會(huì)加r/R。

1.3 普通字符

普通字符在正則表達(dá)式中,代表字符本身。

#匹配一個(gè)字符串,第一個(gè)字符是a,第二個(gè)字符是b,第三個(gè)字符也是最后一個(gè)字符是c。
re_str=r'abc'
result=re.fullmatch(re_str,'abcd')
print(result)

1.4 .(匹配任意字符)

在正則表達(dá)式中,.出現(xiàn)的位置,可以匹配一個(gè)任意字符;
注意:一個(gè).只能匹配一個(gè)字符

 #匹配一個(gè)長(zhǎng)度是3的字符,并且第一個(gè)字符是a,最后一個(gè)是c,中間是任意字符
re_str=r'a.c'
result=re.fullmatch(re_str,'acc')
print(result)

1.5 \w(匹配字母數(shù)字或者下劃線)

在正則表達(dá)式中,\w出現(xiàn)的位置,可以匹配一個(gè)任意的字母、數(shù)字或者下劃線(其實(shí)也可以匹配Unicode編碼中除了ASCII碼剩下的部分(Unicode碼中除了ASCII碼中的非字母數(shù)字下劃線,其他的都能匹配))
一個(gè)\w只能匹配一個(gè)字符;中文也能匹配。

# 匹配一個(gè)長(zhǎng)度是5的字符串,并且字符串的前兩位是數(shù)字、字母或者下劃線,后面是三個(gè)任意字符
re_str=r'\w\w...'
result=re.fullmatch(re_str,'_a123')
print(result)

1.6 \s(匹配空白字符)

空白字符包括:空格、制表符和換行符(空格,\t,\r,\n)

# 匹配一個(gè)長(zhǎng)度是4的字符串,并且字符串前兩位是字母數(shù)字或者下劃線,中間是個(gè)空白,最后一個(gè)也是字母數(shù)字或者下劃線
re_str=r'\w\w\s\w'
result=re.fullmatch(re_str,'hj\t8')
print(result)

1.7 \d(匹配數(shù)字字符)

# 匹配一個(gè)長(zhǎng)度是5的字符串,字符串前三位是數(shù)字字符,后兩位是任意字符
re_str=r'\d\d\d..'
result=re.fullmatch(re_str,'082ww')
print(result)

1.8 \b(檢測(cè)單詞邊界)

注意:\b是檢測(cè)\b出現(xiàn)的位置是否是單詞邊界,不會(huì)對(duì)字符進(jìn)行匹配。
當(dāng)正則表達(dá)式中出現(xiàn)了\b,匹配的時(shí)候去掉\b,匹配成功后再看\b出現(xiàn)的位置是否是單詞邊界
單詞邊界:字符串開頭、字符串結(jié)尾、標(biāo)點(diǎn)符號(hào)、空白符號(hào)等(只要能將單詞區(qū)分開的符號(hào)都屬于單詞邊界)

re_str=r'hello\bworld'
result=re.fullmatch(re_str,'hello world')
print(result) #None

re_str=r'\bhello,\bworld'
result=re.fullmatch(re_str,'hello,world')
print(result)

1.9 ^(檢測(cè)字符串開頭)

在match和fullmatch中沒(méi)有意義,search、findall等中有意義。

匹配一個(gè)字符串前面三個(gè)字符是‘The’,后面兩個(gè)任意字符
re_str='^The..'
result=re.fullmatch(re_str,'The2;')
print(result) # The2;

# search中有意義
print(re.search(re_str,'xxxxThe23'))  # None

1.10 $(檢測(cè)字符串結(jié)尾)

在match和fullmatch中沒(méi)有意義,search、findall等中有意義.

# 匹配一個(gè)字符串,只有三位,分別是‘The’,并且e后面是字符串結(jié)尾
re_str=r'The$'
result=re.fullmatch(re_str,'The')
print(result)# 'The'

print(re.search(re_str,'xxThexx')) # None

1.11 \大寫字母

‘\大寫字母’對(duì)應(yīng)的功能是‘\小寫字母’功能取反
\W - 匹配非字母數(shù)字下劃線
\D - 匹配非數(shù)字字符
\S - 匹配非空白字符
\B - 檢測(cè)非單詞邊界

# 匹配一個(gè)字符串,第一個(gè)字符是數(shù)字、第二個(gè)是非數(shù)字,第三個(gè)是空白,第四個(gè)是空白,最后一個(gè)a,
# 并且要求a前面不能是單詞邊界
re_str=r'\d\D\s\s\Ba'
print(re.fullmatch(re_str,'2a  a')) # None  a前面是兩個(gè)空白,但要求不能是單詞邊界,所以是None

1.12[字符集] (匹配中括號(hào)出現(xiàn)的任意一個(gè)字符)

1.12.1.[普通字符集] (匹配中括號(hào)出現(xiàn)的任意一個(gè)字符)

例如:[abc] - 匹配一個(gè)字符是a或者b或者c
注意:
a.一個(gè)中括號(hào)只能匹配一個(gè)字符,
b.正則表達(dá)式中有特殊功能的單個(gè)(例如.$^+?|等)符號(hào)放中括號(hào)里面失去原有的功能,變成普通符號(hào);
c.
匹配字符的組合符號(hào)(\d,\w,\s等),在中括號(hào)中仍然保持原有特殊意義.*

# 匹配一個(gè)長(zhǎng)度是2的字符串,第一個(gè)字符是數(shù)字,第二個(gè)字符是b或者c或者d
re_str=r'\d[bcd]'
result=re.fullmatch(re_str,'2d')
print(result)

1.12.2[字符1-字符2] - 表示字符串1到字符串2(注意:要求字符1的編碼值小于字符2)

[a-z] - 表示匹配所有的小寫字母
[A-Z] - 表示匹配所有的大寫字母
[a-zA-Z] - 匹配所有的字母
[1-7] 匹配數(shù)字字符1到7
[\u4e00-\u9fa5] - 匹配所有的中文
[字符1字符2-] - 這兒的-表示減號(hào)本身

# 匹配一個(gè)長(zhǎng)度是3的字符串,第一個(gè)字符是數(shù)字字符1到7中的一個(gè),
# 第二個(gè)是abc-中的一個(gè),第三個(gè)是小寫字母
re_str=r'[1-7][abc-][a-z]'
result=re.fullmatch(re_str,'3-b')
print(result)

1.13 [^字符集] - 匹配不在字符集中的任意一個(gè)字符

[^abc] - 匹配除了a,b,c以外的任意一個(gè)字符
[^\d] - 匹配除了數(shù)字字符以外的其他任意一個(gè)字符
[^a-z] - 匹配除了小寫字母以外的其他任意一個(gè)字符
[abc^] -匹配abc^中的任意一個(gè)字符.

re_str=r'[^a-z]'
result=re.fullmatch(re_str,'是')
print(result) # 是

2 正則控制匹配次數(shù)

2.1 *(匹配0次或者多次)

a* - a出現(xiàn)0次或者多次,'',‘a(chǎn)’,'aa','aaa' 都可以匹配
\d* - 任意數(shù)字出現(xiàn)0次或者多次,'','1','12' 都可以匹配
[abc]* - a,b或者c出現(xiàn)0次或者多次
[A-F]* - A到F中任意字符出現(xiàn)0次或者多次
注意:在[]外面的*的前面需要一個(gè)字符或者一個(gè)匹配字符的符號(hào)

print(re.fullmatch(r'a*b','b'))
print(re.fullmatch(r'[abc]*','aaabc'))

2.2 +(匹配1次或者多次)

a+ - a至少出現(xiàn)一次
\d+ - 數(shù)字至少出現(xiàn)一次

print(re.fullmatch(r'a+b','aaaaaaaab')) # 沒(méi)有a不能匹配

2.3 ?(匹配0次或者1次)

a? - a出現(xiàn)0次或者1次,'','a'可以匹配

寫一個(gè)正則表達(dá)式匹配一個(gè)整數(shù)(正整數(shù)和負(fù)整數(shù)都可以)
re_str=r'[+-]?[1-9]\d*'
result=re.fullmatch(re_str,'+1')
print(result)

2.4{}

{N} - 匹配N次,a{3}: 匹配三個(gè)'a'
{M,N} - 匹配M到N次,M<N
例如:a{3,5},匹配3個(gè)'a',或者4個(gè)'a',或者5個(gè)'a'
{,N} - 最多匹配N次(0-N)例如a{,2} ,'' 'a','aa'
{M,} - 至少匹配N次

# 輸入密碼,要求檢測(cè)密碼輸入是否合格(密碼由數(shù)字和字母組成,數(shù)字不開頭,6-12位)
re_str=r'[a-zA-Z][\da-zA-Z]{5,11}'
str1=input('請(qǐng)輸入密碼(6-12位),不能以數(shù)字開頭:')
result=re.fullmatch(re_str,str1)
if result:
    print('密碼正確')
else:
    print('密碼錯(cuò)誤')

3 分之、捕獲和貪婪

3.1 分之

條件1 | 條件2 匹配條件1或者條件2
\d{2}|[a-z] - 匹配兩個(gè)數(shù)字字符或者一個(gè)小寫字母。
注意:正則中的分之也會(huì)出現(xiàn)短路,當(dāng)條件1可以匹配,就不會(huì)在使用條件2進(jìn)行匹配

import re
print(re.fullmatch(r'\d{2}|[a-z]','z'))
print(re.fullmatch(r'a\d{2}|\w{2}','__'))

# 寫一個(gè)正則表達(dá)式,匹配所有的數(shù)字
re_str=r'[-+]?[1-9]\d*[.]?\d*|[-+]?0[.][0-9]*[1-9]|0'
result=re.fullmatch(re_str,'0.00009')
print(result)

3.2 捕獲和分組

3.2.1 分組 - 將括號(hào)中的內(nèi)容作為一個(gè)整體

# 匹配一個(gè)字符串,以數(shù)字小寫字母的形式出現(xiàn)三次
re_str=r'(\d[a-z]){3}'
print(re.fullmatch(re_str,'2a2b5f'))  
# 匹配一個(gè)字符串,前三位是abc,后三位是三個(gè)數(shù)字或者三個(gè)大寫字母
re_str1=r'abc(\d{3}|[A-Z]{3})'
print(re.fullmatch(re_str1,'abc122'))

3.2.2 捕獲

通過(guò)正則獲取符合條件的子串的時(shí)候,可以在正則表達(dá)式中加括號(hào),匹配后只獲取括號(hào)里面匹配到的內(nèi)容
re.findall(正則表達(dá)式,字符串) - 在字符串中去獲取符合正則表達(dá)式條件的所有的子串,返回一個(gè)列表

str1='ahs123+34asdf24'
print(re.findall(r'\d+',str1)) # ['123', '34', '24']

str2='a153s123+34asfa24'
print(re.findall(r'a\d+',str2))  # ['a153', 'a24']
print(re.findall(r'a(\d+)',str2)) # ['153', '24']

3.2.3重復(fù)匹配

帶多個(gè)分組的正則表達(dá)式可以在分組的后面通過(guò)添加\數(shù)字來(lái)重復(fù)前面第幾個(gè)分組中匹配到的內(nèi)容
說(shuō)明:\數(shù)字 - 這兒的數(shù)字代表前面第幾個(gè)分組;\1代表第一個(gè)分組

re_str=r'(\d{3})([a-z]{2})a\1{2}-\2'
print(re.fullmatch(re_str,'123efa123123-ef'))

3.3 貪婪

匹配次數(shù)后加?就是貪婪匹配:*?,+?,??,{M,N}?,{M,}?表示盡可能少的重復(fù)

re_str='a.+b' # 以a和b結(jié)尾,中間字符任意個(gè)
re_str1='a.+?b'
str1='xxahdjbnnkhasssbkkkkk'
print(re.findall(re_str,str1)) # ['ahdjbnnkhasssb'] 普通方法
print(re.findall(re_str1,str1)) # ['ahdjb', 'asssb'] 貪婪方法

#從一個(gè)json文件中提取出人們的名字(名字以”name“開頭,接著是:后面是要提取的內(nèi)容,名字以逗號(hào)結(jié)尾)
with open('file',encoding='utf-8') as f:
    text=f.read()
    re_str='"name":(.+?),'  # 用貪婪方法能將每個(gè)人的名字分開,而不是提取出的第一個(gè)name到最后一個(gè)逗號(hào)中的全部?jī)?nèi)容
    all_names=re.findall(re_str,text)
    print(all_names)

3.4 轉(zhuǎn)義字符

在正則表達(dá)式中,可以在有特殊意義或者特殊功能的符號(hào)前加\來(lái)取消其特殊功能
\w - 代表兩個(gè)字符,分別是''和w
+ - 代表+字符
* - 代表*字符
? - 代表?字符
[],{},() 表示字符的時(shí)候,前面也要加(前面和后面都要加)
注意:在中括號(hào)中,\必須加\表示其本身,^在最前面的時(shí)候加\表示其本身,-在兩個(gè)字符之間加\表示其本身

re_str=r'a\+\(\d{2}\)'
print(re.fullmatch(re_str,'a+(23)'))

4 re模塊

4.1 complie

compile(正則表達(dá)式) - 將正則表達(dá)式轉(zhuǎn)換成正則表達(dá)式對(duì)象
轉(zhuǎn)換成對(duì)象后可以通過(guò)對(duì)象調(diào)用對(duì)象方法

re_str=r'\d{3}'
re_obj=re.compile(re_str)
# 調(diào)用模塊中的函數(shù)
print(re.fullmatch(re_str,'243'))
# 調(diào)用對(duì)象方法
print(re_obj.fullmatch('234'))

4.2 match和fullmatch

a.fullmatch(正則表達(dá)式,字符串) - 完全匹配,從字符串開頭匹配到字符串結(jié)束
b.match(正則表達(dá)式,字符串) - 不完全匹配,只匹配字符串開頭
匹配成功返回匹配對(duì)象,匹配失敗返回None

re_str=r'\d[A-Z]{2}'
result1=re.fullmatch(re_str,'2HKsif')
print(result1) # None
result2=re.match(re_str,'8KLsifdfd==')
print(result2) # '8KL'

4.3匹配對(duì)象

4.3.1 span

span - 匹配到的內(nèi)容的范圍,(開始下標(biāo),結(jié)束下標(biāo)),結(jié)束下標(biāo)取不到
匹配對(duì)象.span() - 獲取整個(gè)正則表達(dá)式匹配到的范圍
匹配對(duì)象.span(n) - 獲取正則表達(dá)式中第n個(gè)分組匹配到的范圍(前提是有分組)

print(result2.span()) # (0, 3)
print(result2.span(1))

4.3.2start和end

start和end - 獲取匹配結(jié)果的開始下標(biāo)和結(jié)束下標(biāo).
匹配對(duì)象.start()/匹配對(duì)象.end() - 獲取整個(gè)正則表達(dá)式匹配到的開始下標(biāo)/結(jié)束下標(biāo)
匹配對(duì)象.start(n)/匹配對(duì)象.end(n) - 獲取正則表達(dá)式中第n個(gè)分組匹配到的開始下標(biāo)/結(jié)束下標(biāo)

print(result2.start(),result2.end())
print(result2.start(1),result2.end(1))

4.3.3group

group - 獲取匹配到的內(nèi)容
匹配對(duì)象.group() -獲取整個(gè)正則表達(dá)式匹配到的內(nèi)容
匹配對(duì)象.group(n)-獲取正則表達(dá)式第n個(gè)分組匹配到的內(nèi)容

print(result2.group())
print(result2.group(1))

4.3.4 string

string - 獲取用來(lái)匹配的原字符串
匹配對(duì)象.string

print(result2.string)

4.4 search

search(正則表達(dá)式,字符串) - 匹配字符串中第一個(gè)滿足正則表達(dá)式的子串,如果匹配成功返回匹配對(duì)象,否則返回None

str1='abc123hks362shjjk990kll'
result=re.search(r'\d{3}[a-z]{2}',str1)
print(result)  # span=(3, 8), match='123hk'

4.5 split

split(正則表達(dá)式,字符串) - 在字符串中按照滿足正則表達(dá)式條件的子串對(duì)字符串進(jìn)行切割

str1='ab+c7hdjd8jss-sk9s9kk*k'
result=re.split(r'\d+|[+*-]+',str1)
print(result) # ['ab', 'c', 'hdjd', 'jss', 'sk', 's', 'kk', 'k']

4.6 sub

sub(正則表達(dá)式,新子串,字符串) - 用新子串替換字符串中滿足正則表達(dá)式的子串,返回一個(gè)替換后的字符串.

str1='你壓是傻叉嗎'
result=re.sub(r'[壓]|[傻叉]','*',str1)
print(result) # 你*是**嗎

4.7findall

findall(正則表達(dá)式,字符串) - 在字符串中獲取滿足正則表達(dá)式的所有的字符,返回一個(gè)列表,列表元素是字符串
注意:如果這個(gè)正則表達(dá)式中有一個(gè)分組,結(jié)果是列表只取那個(gè)分組匹配到的結(jié)果
如果這個(gè)正則表達(dá)式中分組的個(gè)數(shù)大于1,結(jié)果是一個(gè)列表,列表中的元素是元祖,元祖中是每個(gè)分組匹配到的內(nèi)容

str1='haja37jjkd89sdhs909nnna238==='
result=re.findall(r'[a-zA-Z]{2,}\d+[a-z]+',str1)
print(result) # ['haja37jjkd', 'sdhs909nnna']

str1='haja37jjkd89sdhs909nnna238==='
result=re.findall(r'[a-zA-Z]{2,}(\d+)([a-z]+?)',str1)
print(result) # [('37', 'j'), ('89', 's'), ('909', 'n')]

4.8 finditer

finditer(正則表達(dá)式,字符串)-獲取字符串中滿足正則表達(dá)式的內(nèi)容,返回的是一個(gè)迭代器,迭代器中的元素是匹配對(duì)象.

str1='haja37jjkd89sdhs909nnna238==='
result=re.finditer(r'[a-zA-Z]{2,}(\d+)([a-z]+?)',str1)
print(result)
print(next(result)) # span=(0, 7), match='haja37j'

自己實(shí)現(xiàn) finditer方法:

def yt_finditer(pattern,string):
    re1=re.search(pattern,string)
    while re1:
        yield re1
        string=string[re1.end():]
        re1=re.search(pattern,string)
result=yt_finditer(r'[a-zA-Z]{2,}(\d+)(a-z)+?',str1)
print(next(result))
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.正則基本符號(hào) 1.1.什么是正則表達(dá)式正則表達(dá)式就是字符匹配的工具;是由正則符號(hào)和普通字符組成,來(lái)匹配不同規(guī)律...
    未醒的夢(mèng)_19b0閱讀 509評(píng)論 0 0
  • 1.正則基本符合 1.1.什么是正則表達(dá)式 正則表達(dá)式就是字符匹配的工具;是由正則符號(hào)和普通字符組成,來(lái)匹配不同規(guī)...
    發(fā)家致富靠養(yǎng)豬閱讀 343評(píng)論 0 0
  • 1.正則表達(dá)式 1.什么是正則表達(dá)式 正則表達(dá)式就是一個(gè)字符匹配的工具;是由正則符號(hào)和普通字符組成,來(lái)匹配不同規(guī)律...
    L丶Y1122閱讀 573評(píng)論 0 0
  • from re import fullmatch, search,findall 正則表達(dá)式就是用來(lái)檢測(cè)字符串是否...
    文_36e3閱讀 464評(píng)論 0 0
  • 因?yàn)槭悄M測(cè)試,就不需要數(shù)據(jù)操作層了,直接模擬緩存實(shí)現(xiàn)即可.首先 導(dǎo)包, 我這用的是maven構(gòu)建的項(xiàng)目: we...
    興厚閱讀 5,738評(píng)論 2 17

友情鏈接更多精彩內(nèi)容