1.什么是正則表達(dá)式(語(yǔ)法通用)
正則就是一種用來(lái)做字符串匹配的工具蜀撑,通過(guò)不同的符號(hào)匹配不同的字符
2.python對(duì)正則表達(dá)式的支持
通過(guò)re模塊提供相應(yīng)支持正則表達(dá)式的方法
a.fullmatch(正則表達(dá)式至壤, 字符串) --> 用正則表達(dá)式和指定字符串進(jìn)行匹配,
如果匹配成功則返回匹配對(duì)象,匹配失敗則返回None
python中的正則表達(dá)式是寫(xiě)在字符串中的咆耿,但是一般情況下會(huì)在最前面加r/R
from re import fullmatch, search
def main():
# 0. 普通字符(代表字符本身)
# 匹配一個(gè)字符串杆煞,只有三個(gè)字符,每個(gè)字符分別是a,b,c
re_str = r'abc'
result = fullmatch(re_str, 'abc')
print(result)
# 1. .(匹配任意字符)
# 注意:a.一個(gè).代表一個(gè)字符
# b. .不能匹配\n
# 匹配一個(gè)字符串蘑险,只有三個(gè)字符滴肿,第一個(gè)字符是a, 第二個(gè)字符是任意字符,第三個(gè)字符是c
re_str = r'a.c'
result = fullmatch(re_str, 'adc')
print(result)
# 2. \w(匹配字母數(shù)字下劃線(xiàn)中文)
# 注意:a.也可以匹配中文(只要是在A(yíng)SCII碼表以外的字符都可以)
# b.一個(gè)\w只能匹配一個(gè)字符
# 匹配一個(gè)字符串佃迄,第一個(gè)字符是任意字符泼差,第二個(gè)和第三個(gè)字符是字母、數(shù)字或者_(dá)呵俏,最后三個(gè)是abc
re_str = r'.\w\wabc'
result = fullmatch(re_str, '中給_abc')
print(result)
# 3. \s(匹配空白字符)
# 空白字符:指的是所有能產(chǎn)生空白的字符堆缘、包括空格、制表符普碎、換行
# 匹配一個(gè)字符串吼肥,前兩個(gè)字符是字母、數(shù)字麻车、下劃線(xiàn)或者中文缀皱,第三個(gè)字符是空白,最后一個(gè)字符是任意字符
re_str = r'\w\w\s.'
result = fullmatch(re_str, 'ab\n5')
print(result)
# 4. \d(匹配數(shù)字字符)
# 匹配一個(gè)字符串有三個(gè)字符动猬,每個(gè)字符都是數(shù)字字符
re_str = r'\d\d\d'
result = fullmatch(re_str, '526')
print(result)
# 5. \b(檢測(cè)單詞邊界)
# a.檢測(cè)正則表達(dá)式中\(zhòng)b所在的位置是否是單詞邊界
# b.單詞邊界:所有可以將兩個(gè)單詞區(qū)分開(kāi)的符號(hào)都是單詞邊界唆鸡,例如:空格,縮進(jìn)枣察,標(biāo)點(diǎn)符號(hào)等争占,單詞開(kāi)頭燃逻,單詞結(jié)尾
# 注意:\b不是匹配符號(hào),不會(huì)匹配出一個(gè)字符臂痕,只是檢測(cè)所在的位置是否滿(mǎn)足要求伯襟。
# 匹配一個(gè)字符串的內(nèi)容是'how are', 并且要求字符'a'的前面是單詞邊界
re_str = r'\bhow \bare'
result = fullmatch(re_str, 'how are')
print(result)
print(fullmatch(r'\b\d\d\d', '586'))
print(search(r'\b\d\d\d\b', 'sdfe954, 586,'))
# 6. ^(檢測(cè)字符串開(kāi)頭)
# 匹配一個(gè)字符串是三個(gè)數(shù)字字符,并且第一個(gè)字符所在的位置是字符串開(kāi)頭
re_str = '^\d\d\d'
result = search(re_str, '598gefeve484geg')
print(result)
# 7. $(檢測(cè)字符串結(jié)尾)
# 匹配一個(gè)字符串是三個(gè)數(shù)字字符握童,并且最后一個(gè)字符的后面是字符串結(jié)尾
re_str = r'\d\d\d$'
result = search(re_str, 'fegg856geg695')
print(result)
# 8. \B(檢測(cè)非單詞邊界)
re_str = r'abc\B123'
result = fullmatch(re_str, 'abc123')
print(result)
# 9. \W(匹配非數(shù)字字母下劃線(xiàn)中文)
# 10. \S(匹配非空白字符)
# 11. \D(匹配非數(shù)字字符)
# 12. [字符集](匹配字符集中的任意一個(gè)字符)
# 注意:一個(gè)[]代表一個(gè)字符
# a.普通用法
# [字符集] - 匹配字符集中的任意一個(gè)字符
# b.表示范圍
# [字符1-字符2] - 匹配字符1到字符2中所有的字符姆怪。要求字符1的編碼值要小于字符2的編碼值
# [1-9] - 數(shù)字1到9
# [a-z] - 小寫(xiě)字母
# [A-Z] - 大寫(xiě)字母
# [a-zA-Z] - 所有字母
# [a-zA-Z\d_] - 數(shù)字字母下劃線(xiàn)
# 匹配一個(gè)字符串有4個(gè)字符,第一個(gè)字符是'a'或者'b'或者'c'澡绩,后邊是123
re_str = r'[abc]123'
result = fullmatch(re_str, 'a123')
print(result)
result = fullmatch(re_str, 'b123')
print(result)
result = fullmatch(re_str, 'c123')
print(result)
# 匹配一個(gè)字符串有4個(gè)字符稽揭,第一個(gè)字符是數(shù)字1-9中的任意一個(gè);最后一個(gè)字符是任意一個(gè)小寫(xiě)字母肥卡;
# 中間兩個(gè)字符是任意數(shù)字
re_str = r'[1-9]\d\d[a-z]'
result = fullmatch(re_str, '585a')
print(result)
re_str = r'[a-zA-Z\d_]'
result = fullmatch(re_str, 's')
print(result)
# 13. [^字符集](匹配沒(méi)有在字符集中的其他任意字符)
# 注意:^放在[]的最前面才表示匹配不在字符集中的其他任意字符溪掀;^如果不放在[]的最前面,就表示字符^本身
# 匹配一個(gè)字符串步鉴,第一個(gè)字符只要不是abc中的一個(gè)揪胃,其他字符都可以,后面是123
re_str = r'[^abc]123'
result = fullmatch(re_str, 'f123')
print(result)
# 匹配一個(gè)字符串氛琢,第一個(gè)字符只要不是1到9中的一個(gè)喊递,其他字符都可以,后面是123
re_str = r'[^1-9]123'
result = fullmatch(re_str, 'f123')
print(result)
# 14. 轉(zhuǎn)義符號(hào)
# a.正則中也可以通過(guò)在特殊符號(hào)前加'\'來(lái)對(duì)符號(hào)進(jìn)行轉(zhuǎn)義
# \\ - \字符
# \. - .字符
# \^ - ^字符
# b.除了在中括號(hào)中有特殊意義的符號(hào)阳似,其他符號(hào)放在[]中也是表示符號(hào)本身
# - :在中括號(hào)中的兩個(gè)字符之間表示誰(shuí)到誰(shuí)骚勘,如果想要表示它本身就不要放在兩個(gè)字符之間
# ^ :在中括號(hào)的最前面有特殊意義,如果想要表示它本身就不要放在最前面
# []:在中括號(hào)中表示[]撮奏,要加\
# 注意:轉(zhuǎn)義字符是字符串中的概念
# 轉(zhuǎn)義符號(hào)是正則表達(dá)式的概念
re_str = r'\d\d\.\d\d'
result = fullmatch(re_str, '23.45')
print(result)
if __name__ == '__main__':
main()
import re
def main():
# 1. *(匹配0次或多次)
# 字符* - 指定的字符出現(xiàn)0次或者多次(這兒的字符可以是正則符號(hào)俏讹,也可以是普通字符)
# a* - a出現(xiàn)0次或者多次
# \d* - 任意數(shù)字出現(xiàn)0次或者多次
# [a-z]* - 任意小寫(xiě)字母出現(xiàn)0次或者多次
# 123前面有0個(gè)或者多個(gè)字符,并且每個(gè)字符都是a
re_str = r'a*123'
print(re.fullmatch(re_str, 'aaa123'))
# 123前面有0個(gè)或者多個(gè)字符挽荡,并且每個(gè)字符都是數(shù)字字符
re_str = r'\d*123'
print(re.fullmatch(re_str, '12123'))
re_str = r'[a-z]*123'
print(re.fullmatch(re_str, 'az123'))
# 2. +(匹配1次或多次)
re_str = r'a+123'
print(re.fullmatch(re_str, 'aaa123'))
# 3. 藐石?(匹配0次或者1次)
re_str = r'\+?abc'
print(re.fullmatch(re_str, '+abc'))
# 練習(xí):寫(xiě)一個(gè)正則表達(dá)式能夠匹配所有的整數(shù)字符串
re_str = r'[+-]?[1-9]\d*'
print(re.fullmatch(re_str, '884'))
# 4. {}
# {M,N} - 匹配M到N次(最少M(fèi)次即供,最多N次)
# {M,} - 匹配至少M(fèi)次
# {,N} - 匹配最多N次
# {N} - 匹配N(xiāo)次
print(re.fullmatch(r'a{2,5}', 'aaaaa'))
# 密碼:6-16位定拟,只能包含數(shù)字和字母
print(re.fullmatch(r'[a-zA-Z\d]{6,16}', '5996548'))
if __name__ == '__main__':
main()
1. |(分支)
表達(dá)式1|表達(dá)式2|表達(dá)式3|... - 先用表達(dá)式1進(jìn)行匹配,匹配成功就直接成功逗嫡;
不成功就使用表達(dá)式2去匹配青自;匹配失敗再用表達(dá)式3去匹配...以此類(lèi)推
(三(N)個(gè)表達(dá)式中只要有一個(gè)能夠匹配成功就成功,否則匹配失敗)
2. ()(分組)
a.分組 - 將括號(hào)里面的內(nèi)容看成一個(gè)整體
(abc){2} --> abcabc
abc{2} --> abcc
b.分組重復(fù) - 在有分組的正則表達(dá)式中驱证,可以在分組的后面通過(guò) '\數(shù)字' 來(lái)重復(fù)前面第幾個(gè)分組匹配到的內(nèi)容
(\d{2})abc\1 --> 78abc78
import re
def main():
re_str = r'[a-z]{3}|\d{3}'
print(re.fullmatch(re_str, 'geg'))
re_str = r'abc([A-Z]{2}|\d{2})'
print(re.fullmatch(re_str, 'abcFE'))
re_str = r'(abc){2}'
print(re.fullmatch(re_str, 'abcabc'))
re_str = r'(\d{2})a(\d{3})bc\2{2}\1'
print(re.fullmatch(re_str, '59a586bc58658659'))
if __name__ == '__main__':
main()