一:正則
1.什么是正則表達(dá)式(語法通用)
正則就是一種用來做字符串匹配的工具:他可以通過不同的符號匹配不同的字符
2.python對正則表達(dá)式的支持
通過re模塊提供相應(yīng)支持正則表達(dá)式的方法
a.fullmatch(正則表達(dá)式,字符串) -->用正則表達(dá)式來和指定字符串匹配智蝠,如果匹配成功,返回匹配對象哮翘。匹配失敗返回None
python中的正則表達(dá)式是寫在字符串中的毛秘,但是一般情況下會在最前面加個r/R
import re
def main():
0 普通字符(代表字符本身)
匹配一個字符串,只有三個字符叫挟,每個字符分別是a,s,d
re_str = r'asd' #
result = re.fullmatch(re_str,'asd')
print(result)
1 .(匹配任意字符)
注意:一個 . 代表一個字符≡蹦【【不能匹配 \n
匹配一個字符串奋献,只有三個字符,第一個字符是a,第二個字符是任意字符瓶蚂,第三個字符是c
re_str = r'a.c'
result = re.fullmatch(re_str, 'awc')
print(result)
2 \w(匹配字母數(shù)字下劃線)
注意:也可以匹配中文窃这。【【一個 \w 只能匹配一個字符
匹配一個字符,第一個字符是任意字符疤坝,第二第三個字符是字母數(shù)字或下劃線馆铁,最后三個是asd
re_str = r'.\w\wasd'
result = re.fullmatch(re_str, 'w_花asd')
print(result)
3. \s(匹配空白字符)
注意:空白字符,指的是所有能產(chǎn)生空白的字符叼架,包括空格、制表符、換行等
re_str = r'\w\w\s.' #匹配一個字符串具练,前兩個是字母數(shù)字或下劃線.第三個是空白,最后一個是任意字符
result = re.fullmatch(re_str, 'qw .')
print(result)
4. \d(匹配數(shù)字字符)
re_str = r'\d\d\d' #匹配一個字符串有三個字符串哥遮,每個字符都是數(shù)字字符串
result = re.fullmatch(re_str, '634')
print(result)
5. \b (檢測單詞邊界)
檢測正則表達(dá)式中\(zhòng)b所在的位置是否是單詞邊界
單詞邊界:所有可以將兩個單詞區(qū)分開的符號都是單詞邊界陵究,例如:空格,縮進铜邮,標(biāo)點符號等。單詞開頭結(jié)尾
匹配一個字符串的內(nèi)容是‘how are’,并且要求字符‘a(chǎn)’的前面是單詞邊界
注意:\b 不是匹配符號扔茅,不會匹配出一個字符秸苗,只是檢測所在位置是否滿足要求。
re_str = r'how\b are'
result = re.fullmatch(re_str, 'how are')
print(result)
6. ^ (檢測字符串開頭)
匹配一個字符串是三個數(shù)字字符惊楼,并且第一個字符是在字符串開頭
re_str = r'^\d\d\d'
result = re.search(re_str, '123asdfqwasdf')
print(result)
7 $(檢測字符串結(jié)尾)
匹配一個字符串是三個數(shù)字字符,并且最后一個字符是在字符串開頭
re_str = r'\d\d\d$'
result = re.fullmatch(re_str, '模壓基本原則asd123')
print(result)
8 \B(檢測非單詞邊界)
re_str = r'asd\B123'
result = re.fullmatch(re_str, 'asd123')
print(result)
9 \W (匹配非數(shù)字雅倒、字母攀芯、下劃線和中文)
10 \S (匹配非空白字符)
11 \D (匹配非數(shù)字字符)
12 [字符集] (匹配字符集中的任意一個字符)
注意:一個[]代表一個字符
a. 普通用法
[字符集] - 匹配字符集中的任意一個字符
b.表示范圍
[字符1-字符2] - 匹配字符1到字符2中所有字符。要求字符1的編碼值要小于字符2的編碼值
[a-zA-Z] 所有字母殖演。 [a-zA-Z\d_] 數(shù)字字母下劃線
匹配一個字符串有4個字符,第一個字符是‘a(chǎn)sd’中的一個趴久,后面是123
re_str = r'[asd]123'
result = re.fullmatch(re_str, 'a123')
print(result)
匹配一個字符串有4個字符,第一個字符是1到9中的任意一個灭忠,最后一個是任意小寫字母座硕。中間兩個是任意數(shù)字
re_str = r'[1-9]\d\d[a-z]' #第一個字符是1到9中的任意一個
result = re.fullmatch(re_str, '112a')
print(result)
13 [^字符集] - 匹配非字符集中的其他任意字符
注意:^放在[]里的最前面才表示匹配不在字符集中的其他任意字符;否則就是表示這個字符本身
第一個字符只要不是asd中的一個其他字符都可以华匾,后面是123
re_str = r'[^asd]123'
result = re.fullmatch(re_str, 'c123')
print(result)
[^1-9] 第一個字符除了1到9都可以
[1-9^] 第一個字符是1到9其中一個或者是^
14 轉(zhuǎn)義符號
a.正則中也可以通過在特殊符號前加‘\’來對符號進行轉(zhuǎn)義
b.除了在中括號中有特殊意義的符號,其他符號放在[]中也是表示符號本身
[.] 表示一個.
- :在中括號中的兩個字符之間表示誰到誰萨西,如果想要表示他本身就不要放在兩個字符之間(加\也可以)
^ :在中括號中的最前面有特殊意義旭旭,如果想要表示他本身就不要放在最前面(加\也可以)
[]:在中括號中表示[],要加 \
注意:轉(zhuǎn)義字符串是字符串中的概念, 轉(zhuǎn)義符號是正則表達(dá)式的概念
re_str = r'\d\d\.\d\d' # \. 反斜線阻止 . 轉(zhuǎn)義,就是一個點源梭。
print(re.fullmatch(re_str,'23.45'))
if __name__ == '__main__':
main()
二:匹配次數(shù)
1 *(匹配0次或多次)
字符 * - 指定的字符出現(xiàn)0次或者多次(這兒的字符可以是正則符號际看,也可以是普通字符)
a* - a出現(xiàn)0次或者多次
\d* - 任意數(shù)字出現(xiàn)0次或者多次
[a-z]* - 任意小寫字母出現(xiàn)0次或者多次
import re
def main():
re_str = r'a*123' # 123前面有0個或者多個字符,并且每個字符都是a
print(re.fullmatch(re_str,'aaaaaa123'))
re_str = r'\d*123' #123前面有0個或者多個字符仲闽,并且每個字符都是數(shù)字字符
2 +(匹配一次或多次)
re_str = r'a+123' # 123前面有1個或者多個字符,并且每個字符都是a
print(re.fullmatch(re_str, 'aaaaaa123'))
re_str = r'\d+123'
3 ?(匹配0次或者1次)
#練習(xí):寫一個正則表達(dá)式屑彻,能夠匹配所有的整數(shù)字符串顶吮。
re_str = r'[-+]?[1-9]\d*' # 123 -123 +123
print(re.fullmatch(re_str, '123'))
4 {}
{M,N} - 匹配M到N次(最少M次,最多N次)
{M,} - 匹配至少M次
{,N} - 匹配最多N次
{N} - 匹配N次
print(re.fullmatch(r'a{2,5}','aaa'))
#密碼;6-16位悴了,只能包含數(shù)字和字母
print(re.fullmatch(r'[a-zA-Z\d]{6,16}','asdfwq123'))
if __name__ == '__main__':
main()
三:分之與分組
- | (分之)
表達(dá)式1 | 表達(dá)式2 | 表達(dá)式3 - 先用表達(dá)式1進行匹配,匹配成功就成功熟空;如果不成功則依次使用后面的表達(dá)式去匹配,有一個匹配成功就成功掂咒。(三個表達(dá)式中只要有一個能匹配成功就成功,否則失斏芄巍)
def main():
re_str = r'[a-z]{3}|\d{3}' #中間不能隨意加空格挨摸,意義不一樣
print(re.fullmatch(re_str,'132'))
a.分組 - 將括號里的內(nèi)容看成一個整體,
b.分組重復(fù) - 在有分組的正則表達(dá)式中可以在分組的后面通過 '\數(shù)字' 來重復(fù)第幾個分組匹配到的內(nèi)容
(\d{2})asd\1 ---> 78asd78 #\1 - 前面第一個分組重復(fù)一次 #\1{2} 第一個分組重復(fù)2次
re_str = r'asd([A-Z]{2}|\d{2})' # 小括號分組
print(re.fullmatch(re_str,'asdKD'))
re_str = r'(asd){2}' # asd整體出現(xiàn)2次 [[r'asd{2}' == asdd
print(re.fullmatch(re_str,'asdasd'))
分組重復(fù)
re_str = r'(\d{2})asd'
print(re.fullmatch(re_str,'34asd34'))
if __name__ == '__main__':
main()