2019-08-13day17總結(jié)正則表達(dá)式

一、正則表達(dá)式1

from re import fullmatch, search, findall

0.fullmatch
fullmatch(正則表達(dá)式, 字符串) - 查看字符串和正則表達(dá)式是否匹配,如果不匹配結(jié)果就是None
正則表達(dá)式:r'正則語法'

1.什么是正則表達(dá)式
正則表達(dá)式是處理字符串的工具,通過撥不通的正則符號來描述字符串的規(guī)則

2.正則符號(正則表達(dá)式的語法)
1)普通字符 - 除了在正則中有特殊功能和特殊意義的符號以外的字符都算普通字符
普通字符代表字符本身

匹配一個字符串有三個字符,分別是'a', 'b', 'c'

re_str = r'abc'
result = fullmatch(re_str, 'abc')
print(result)

2). - 匹配任意一個字符
一個.只能匹配一個字符

匹配一個字符串長度是8,前三個字符時abc,后三個字符時123,中間是兩個任意字符

re_str = r'abc..123'
result = fullmatch(re_str, 'abcwl123')
print(result)

3)\w - 匹配一個數(shù)字、字母或者_(dá)(在ASCII碼表中)
一個\w只能匹配一個字符

匹配一個長度是4的字符串,第一個字符時數(shù)字、字母、或_,后面是哪個字符是'abc'

re_str = r'\wabc'
result = fullmatch(re_str, '_abc')
print(result)

4)\d - 匹配任意一個數(shù)字字符
匹配一個長度是5 的字符串,前兩個字符是任意數(shù)字,后面三個是任意字符

re_str = r'\d\d...'
result = fullmatch(re_str, '98lol')
print(result)

5)\s - 匹配任意一個空白字符
空白字符包括:空格、換行、制表符...

result = fullmatch(r'how\sare!', 'how are!')
print(result)

6)\大寫字母
\D - 匹配除了數(shù)字字符以外的任意字符(匹配一個非數(shù)字字符)
\S - 匹配一個非空白字符

re_str = r'\Dabc\S'
result = fullmatch(re_str, 'aabc5')
print(result)

7)[字符集] - 匹配字符集中出現(xiàn)的任意一個字符
注意:一個[]只能匹配一個字符

a.
[abc] - 匹配abc中任意一個字符
[趙錢孫李] - 匹配趙錢孫李中的任意一個字符

匹配一個長度是4的字符串,第一個字符是1或者3或者3,后面是abc

re_str = r'[137]abc'
print(fullmatch(re_str, '1abc'))

b.
[1-9] - 匹配1到9中的任意一個字符(字符編碼值遞增)
[a-z] - 匹配任意一個小寫字母
[A-Z] - 匹配任意一個大寫字母
[a-zA-Z] - 匹配任意一個字母
[a-zA-Z0-9_] / [A-Za-z0-9_] - 匹配任意一個字母、數(shù)字或_
[ \t\n] - 匹配任意一個空白字符
[\u4e00-\u9fa5] - 匹配任意一個中文字符

re_str = r'[!-&]abc'
print(fullmatch(re_str, '!abc'))

8)[^字符集] - 匹配不在字符集中的任意一個字符
[^abc] - 匹配任意一個不是a、b、c的字符

檢測符號
所有的檢測符號都不會影響字符串的長度

1)\b - 檢查是否是單詞邊界
單詞邊界 - 能夠?qū)蓚€單詞隔開并且不會產(chǎn)生歧義的任意符號:空白字符、標(biāo)點(diǎn)符號、字符串開頭字符串結(jié)尾
how are、how,are、how-are
匹配規(guī)則:先去掉\b對字符串進(jìn)行匹配,如果匹配成功再檢查\b所在的位置是否是單詞邊界

2)^ - 檢查^所在位置是否是字符串開頭
注意:這兒的^是在[]外

3)- 檢查所在的位子是否是字符串結(jié)尾

二、正則表達(dá)式2

from re import *

控制次數(shù)的符號:字符符號

1.* - 匹配0次或多次
123a* - 123后面a出現(xiàn)0次貨多次
123\d* - 123后面出現(xiàn)0個或者多個任意數(shù)字字符

123[mnxy9]*   - 123

re_str = r'abc0*123'
print(fullmatch(re_str, 'abc123'))

2.+ - 匹配1次或多次

re_str = r'123[abc]+'
print(fullmatch(re_str, '123abcaaaa'))

3.? - 匹配0次或1次

-?123   - 123/-123

re_str = r'_?abc'
print(fullmatch(re_str, '_abc'))

4.{}
1){N} - 匹配N次
a{3} - 匹配三個a, aaa
\d{3} - 匹配三個任意數(shù)字

匹配電話號碼

re_str = r'1[3-9]\d{9}'

2){M,N} - 匹配M到N次(至少M(fèi)次,最多N次)

匹配密碼:要求是6-12位的字母

re_str = r'[a-zA-Z]{6,12}'

3){M,} - 匹配至少M(fèi)次

4){,N} - 匹配最多N次

5.貪婪和非貪婪
在匹配次數(shù)不確定的時候,會出現(xiàn)貪婪和非貪婪兩種情況:默認(rèn)情況都是貪婪的。

什么是貪婪:在能夠匹配成功的前提下,匹配次數(shù)盡可能多

re_str = r'a.+'
print(search(re_str, 'sda====fsjuhfisf54df54d'))
print(search(r'a\d{3,8}', 'dahhfdbja12315456413215'))

什么是非貪婪:在能夠匹配成功的前提下,匹配次數(shù)盡可能少;(在匹配次數(shù)后加?)

*?
+?
??
{M,N}?
{M,}?
{,N}?
print(search(r'a\d{3,8}?', 'dahhfdbja12315456413215'))

分之

  1. |
    正則1|正則2 - 先讓正則1區(qū)匹配,如果匹配成功就成功;匹配失敗再讓正則2去匹配
    (正則1和正則2中只要有一個能夠匹配成功就行)
    練習(xí)1:寫一個正則表達(dá)式,匹配一個字符串:abc的前面是兩個數(shù)字或者兩個大寫字母
    23abc,WLabc

方法一:

re_str = r'\d{2}abc|[A-Z]{2}abc'

方法二:
分組
1.() - 將括號里面的內(nèi)容作為一個整體
1)整體操作

r'(\d\d|[A-Z]{2})abc'
2)a8d5d6f8
r'([a-z]\d){4}'

3)分組
a.方便后面分段或者分情況取不同的匹配結(jié)果
b.分組重復(fù):在正則中用\X來重復(fù)前面第X個分組匹配到的內(nèi)容
注意:\X的前面必須有這個分組

re_str = r'abc|123'
print(fullmatch(re_str, 'abc'))
print(fullmatch(re_str, '123'))

轉(zhuǎn)義
1.加
在正則中有特殊功能和特殊意義的符號前加\,讓這個符號的特殊功能和意義消失

2.加[]
在[]中有特殊意義的符號有兩個:a.^放在開頭 b.-放在兩個字符之間
其他符號包括:.+ ? * $,這些單獨(dú)的符號在[]中都表示符號本身

三、re模塊

from re import *

re模塊是python提供的,專門針對正則表達(dá)式應(yīng)用相關(guān)函數(shù)

1.compile(正則表達(dá)式) ->將正則表達(dá)式轉(zhuǎn)換成正則對象

compile()

2.字符串匹配
fullmatch(正則表達(dá)式, 字符串) - 讓正則表達(dá)式和字符串完全匹配
match(正則表達(dá)式, 字符串) - 匹配字符串開頭
以上兩個方法的結(jié)果:匹配失敗結(jié)果是None,匹配成功返回匹配對象

re_str = r'\d{3}'
print(fullmatch(re_str, '789'))
print(match(re_str, '123dasuidhdihif==='))

1)匹配對象

result = fullmatch(r'(\d{3})=([a-z]{2})', '234=am')
print(result)

a.獲取匹配到的字符串
匹配對象.group() - 獲取整個正則表達(dá)式匹配到的字符串,結(jié)果是字符串
匹配對象.group(N) - 獲取整個正則表達(dá)式中地N個分組匹配到的字符串

print(result.group())
print(result.group())
print(result.group(1))
print(result.group(2))

b.獲取匹配到的字符串在原字符串中的位置信息
匹配對象.span() ->返回匹配結(jié)果在原字符串中的下標(biāo)范圍:[開始下標(biāo),結(jié)束下標(biāo))
匹配對象.span(N) ->返回地N個分組匹配到的結(jié)果在原字符串中的范圍

print(result.span())
print(result.span(2))
start, end = result.span(1)
print(start, end)

c.獲取原字符串
匹配對象.string

print(result.string)

3.查找
1)search(正則表達(dá)式, 字符串) - 在字符串中查找第一個滿足正則表達(dá)式的子串,如果找到了結(jié)果是匹配對象,找不到就是None

result = search(r'\d{3}', '是否234ash==347jsdf')
print(result)

2)findall(正則表達(dá)式, 字符串) - 獲取字符串中所有滿足正則表達(dá)式的子串;返回值是一個列表
注意:如果正則表達(dá)式中有分組,列表中的匹配結(jié)果只會去分組匹配到的內(nèi)容

result = findall(r'\d{3}[a-z]{2}', '是234hu士大夫345mmks89h-=數(shù)348kl幾十塊的')
print(result)
result = findall(r'(\d{3})([a-z]{2})', '是234hu士大夫345mmks89h-=數(shù)348kl幾十塊的')
print(result)

3)finditer(正則表達(dá)式, 字符串) - 獲取字符串中所有滿足正則表達(dá)式的子串;返回值是一個迭代器

result = finditer(r'(\d{3})([a-z]{2})', '是234hu士大夫345mmks89h-=數(shù)348kl幾十塊的')
group = []
group1 = []
group2 = []

for i in result:
    group.append(i.group())
    group1.append(i.group(1))
    group2.append(i.group(2))

print(group,group1,group2)

4.切割
split(正則表達(dá)式, 字符串) ->將字符串中滿足正則表達(dá)式的子串作為切割點(diǎn)隊(duì)長字符進(jìn)行切割,返回值是一個字符串列表

result = split(r'\d+', '愛好3ja89是電話費(fèi)889將括號看0===三等獎9數(shù)據(jù)98=的')
print(result)

5.替換

sub(正則表達(dá)式, 字符串1 , 字符串2) - 將字符串2中所有滿足正則表達(dá)式的子串都替換成字符串1,返回一個字符串

message = input('評論:')  # 你媽逼,fuck you ,F(xiàn)UCK!
new_massage = sub(r'媽|fuck|逼', '*', message, flags=IGNORECASE)
print(new_massage)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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