一:正則
1.什么是正則表達式(語法通用)
正則就是一種用來做字符串匹配的工具:他可以通過不同的符號匹配不同的字符
2.python對正則表達式的支持
通過re模塊提供相應支持正則表達式的方法
a.fullmatch(正則表達式,字符串) -->用正則表達式來和指定字符串匹配,如果匹配成功,返回匹配對象。匹配失敗返回None
python中的正則表達式是寫在字符串中的,但是一般情況下會在最前面加個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 (檢測單詞邊界)
檢測正則表達式中\(zhòng)b所在的位置是否是單詞邊界
單詞邊界:所有可以將兩個單詞區(qū)分開的符號都是單詞邊界,例如:空格,縮進,標點符號等。單詞開頭結尾
匹配一個字符串的內(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 $(檢測字符串結尾)
匹配一個字符串是三個數(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 轉義符號
a.正則中也可以通過在特殊符號前加‘\’來對符號進行轉義
b.除了在中括號中有特殊意義的符號,其他符號放在[]中也是表示符號本身
[.] 表示一個.
- :在中括號中的兩個字符之間表示誰到誰,如果想要表示他本身就不要放在兩個字符之間(加\也可以)
^ :在中括號中的最前面有特殊意義,如果想要表示他本身就不要放在最前面(加\也可以)
[]:在中括號中表示[],要加 \
注意:轉義字符串是字符串中的概念, 轉義符號是正則表達式的概念
re_str = r'\d\d\.\d\d' # \. 反斜線阻止 . 轉義,就是一個點。
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次)
#練習:寫一個正則表達式,能夠匹配所有的整數(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()
三:分之與分組
- | (分之)
表達式1 | 表達式2 | 表達式3 - 先用表達式1進行匹配,匹配成功就成功;如果不成功則依次使用后面的表達式去匹配,有一個匹配成功就成功。(三個表達式中只要有一個能匹配成功就成功,否則失?。?/li>
def main():
re_str = r'[a-z]{3}|\d{3}' #中間不能隨意加空格,意義不一樣
print(re.fullmatch(re_str,'132'))
a.分組 - 將括號里的內(nèi)容看成一個整體,
b.分組重復 - 在有分組的正則表達式中可以在分組的后面通過 '\數(shù)字' 來重復第幾個分組匹配到的內(nèi)容
(\d{2})asd\1 ---> 78asd78 #\1 - 前面第一個分組重復一次 #\1{2} 第一個分組重復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'))
分組重復
re_str = r'(\d{2})asd'
print(re.fullmatch(re_str,'34asd34'))
if __name__ == '__main__':
main()