一伙单、正則表達(dá)式
正則表達(dá)式主要用于字符串查找‘匹配潘酗、分割
import re
match(正則表達(dá)式字符串淳梦,需要匹配的字符串)
1.不帶任何正則字符的正則表達(dá)式
str1 = 'abc'
print(re.match('abc', str1))
2.點(diǎn)號(hào). -->匹配任意的字符
r'a.c':匹配一個(gè)字符串第一個(gè)字符是'a'艾船,第二個(gè)字符是任意字符顶籽,第三個(gè)字符是'c'的字符
str1 = 'a^ch' # 只會(huì)匹配a-c,c后面寫在多都沒用
print(re.match(r'a.c', str1))
寫一個(gè)正則表達(dá)式玩般,可以匹配一個(gè)字符串第一個(gè)字符是g中間是兩個(gè)任意字符,然后一個(gè)d
str2 = 'good'
print(re.match(r'g..d', str2))
3.\w:匹配字母礼饱、數(shù)字坏为、下劃線
str1 = 'good'
print(re.match(r'g\w\wd', str1))
4.\s:匹配空白字符(空格(\r)、制表符(\t)镊绪、回車(\n)等)
寫一個(gè)正正則表達(dá)式匀伏,匹配第一個(gè)字符是數(shù)字、字母或者下劃線蝴韭,第二個(gè)字母是a够颠,第三個(gè)字符是空白
str1 = '1a '
print(re.match(r'\wa\s', str1))
5.\d:匹配數(shù)字
匹配前兩位必須是數(shù)字的字符串
print(re.match(r'\d\d', '14522'))
6.\b:匹配單詞的邊界
邊界:字符串的開始和結(jié)束、空格榄鉴、標(biāo)點(diǎn)符號(hào)履磨、括號(hào)、波浪號(hào)庆尘、回等
注意:\b是不能匹配出結(jié)果的剃诅,只是對(duì)對(duì)需要出現(xiàn)邊界的要求
(遇到\b的時(shí)候,一定要注意\b后邊的要求的字符必須是單詞的邊界才會(huì)成功)
re_str = r'\bhow\b'
print(re.match(re_str, 'how,are'))
7.^:匹配開頭
^the --->匹配以the開頭的字符
print(re.match(r'^the', 'theabc'))
8.$:匹配字符串結(jié)束
'the$'-->匹配字符串以'the結(jié)束'
print(re.match(r'the$', 'the'))
9.\大寫字母 -->與相應(yīng)的小寫字母的功能相反
10.[]:匹配[]號(hào)任意的一個(gè)字符驶忌,可以是具體的字符也可以是正則符號(hào),一個(gè)[]只能匹配一位的字符
re_str = r'[abc]123' # 匹配第一個(gè)字符是'a'或者'b'或者'c'综苔,后面是的字符串
print(re.match(re_str, 'a123'))
re_str = r'abc[\da]'
print(re.match(re_str, 'abc2'))
11.[^]:匹配不在[]中的任意的一個(gè)字符
re_str = r'[^abc]123' # 匹配一個(gè)字符不是a或者b或者c,后面是123的字符串
print(re.match(re_str, '@123'))
12.*:匹配0次或者多次
r'a' -->匹配第一個(gè)字符是0個(gè)'a'或者多個(gè)'a';'cc','abc','aaabc'
r'\d' -->匹配第一個(gè)字符是0個(gè)或者多個(gè)數(shù)字位岔;'cc','abc','123abc'
r'[abc]*-->'cc','abckk'
print(re.match(r'a*', 'aaacc'))
13.+:匹配1次或者多次
r'a+' -->匹配第一個(gè)字符串開頭是一個(gè)a或者多個(gè)a:'acc', 'aacc', 'aaadjk'
r'\w+'-->前面是一個(gè)或多個(gè)字母數(shù)字下劃線
print(re.match(r'a+', 'abnd'))
14.?:匹配0次或者1次
r'a?123' -->匹配一個(gè)字符串'123'前面有一個(gè)a或者沒有字符
print(re.match(r'a?123', '123'))
15.{n}:匹配n次
寫一個(gè)正則表達(dá)式如筛,完全匹配一個(gè)11位的數(shù)字字符串
print(re.match(r'\d{11}$', '12345678912'))
寫一個(gè)正則表達(dá)式匹配第一位是1,第二位是3,5,7,8其他九位是任意數(shù)字
str1 = r'1[3578]\d{9}$'
print(re.match(str1, '13562348397'))
16.{n,}:匹配至少n次
r'\d{3,}-->匹配字符串開始是三個(gè)或者三個(gè)以上的數(shù)字抒抬;'123abc','12345ab'
print(re.match(r'\d{3,}', '12345abc'))
17.{m,n}:匹配至少m次杨刨,最多n次
要求密碼是6-16位,由字母數(shù)字下劃線組成
str1 = r'\w{6,16}'
print(re.match(str1, 'abnf123__'))
判斷一個(gè)字符串是否是標(biāo)識(shí)符(字母數(shù)字下劃線擦剑,數(shù)字不開頭)
a-z:是字母a-z中的任意一個(gè)妖胀,這是小寫,大寫也可以這么寫惠勒;同理1-9
str2 = r'[a-zA-Z_]\w*$'
print(re.match(str2, 'A2hdj'))
18.|:分子(相當(dāng)于邏輯運(yùn)算符中的or)
r'(a|b)abc'-->匹配第一個(gè)字符是a或者b赚抡,后面是abc
r'\d{3}|([a-zA-Z]{3}) -->匹配開頭是3個(gè)數(shù)字或者是3個(gè)字母
print(re.match(r'(a|b)abc', 'aabc'))
print(re.match(r'\d{3}|([a-zA-Z]{3})', '231cvd'))
19.*?:匹配0次或多次,但盡可能少的匹配
print(re.match(r'a*?', 'aabc'))
20.+?:重復(fù)一次或者多次纠屋,盡可能少的匹配
print(re.match(r'a+?', 'aabc'))
總結(jié)?:就是在重復(fù)多次的匹配中如何后面加?涂臣,匹配的時(shí)候以能匹配的最少次數(shù)去匹配
用戶名必須是由字母數(shù)字下劃線構(gòu)成的長(zhǎng)度為6-20個(gè)字符之間,QQ號(hào)是5-12個(gè)的數(shù)字組成,首位不能為0
str1 = r'\w{6, 20}'
str2 = r'[1-9]\d{4, 11}'
二赁遗、內(nèi)置函數(shù)
1.compile方法
將正則表達(dá)式編譯成正則對(duì)象(就可以去調(diào)用相關(guān)的正則表達(dá)式對(duì)象方法)
result = re.compile(r'\d{2}[a-zA-Z]{2}')
print(type(result))
2.match方法
a.match(正則表達(dá)式字符串/對(duì)象署辉,要匹配的字符串)
用指定的正則表達(dá)式和指定的字符串進(jìn)行匹配,如果匹配成功岩四,就返回匹配對(duì)象哭尝,否則就返回None
b.正則表達(dá)式對(duì)象.match(要匹配的字符串)
result = re.match(r'a\dd.', 'a5dl5dg')
print(result)
# 獲取匹配結(jié)果在原字符串中的范圍
print(result.span()) # (0, 4)
# 可以獲取匹配開始的位置和結(jié)束的位置
print(result.start(), result.end()) # 0 4
# 獲取匹配的結(jié)果
print(result.group()) # a5dl
# 獲取原字符串
print(result.string) # a5dl5dg
3.search
a. re.search(指定的正則表達(dá)式/對(duì)象,指定的字符串)
b. 正則對(duì)象.search(指定的字符串)
在指定的字符串中剖煌,去查找第一個(gè)(只查找第一個(gè))指定正則表達(dá)式匹配的字符串,
如果找到了就返回匹配對(duì)象材鹦,沒有就返回None
result = re.search(r'a\dc', 'ioja3clma6cj')
print(result)
4.findall
re.findall(指定的正則表達(dá)式/對(duì)象,指定的字符串)
獲取指定字符串中耕姊,所有滿足正則表達(dá)式的子串桶唐,返回值是一個(gè)列表。如果沒有就返回一個(gè)空列表
result = re.findall(r'a\dc', 'ioja3clma6cj')
print(result) # ['a3c', 'a6c']
練習(xí):獲取一個(gè)字符串中箩做,所有以ing結(jié)束的單詞
'I love singing dan dancing aingc'
result = re.findall(r'\b[A-Za-z]*ing\b', 'I love singing dan dancing aingc')
print(result)
5.split
re.split(指定的正則表達(dá)式/對(duì)象,指定的字符串,最大的拆分?jǐn)?shù)(默認(rèn)是 0妥畏,全部拆分))
正則對(duì)象.split(指定的字符串)
result = re.compile('[,\s]').split('abc,bcd,amn,ssdf oopp oplk')
print(result)
'窗前明月光邦邦,疑是地上霜,舉頭望明月醉蚁,低頭思故鄉(xiāng)燃辖。'
result = re.split(r'[,网棍。]', '窗前明月光黔龟,疑是地上霜。舉頭望明月滥玷,低頭思故鄉(xiāng)氏身。')
del result[-1]
print(result)
6.sub
re.sub(正則表達(dá)式/對(duì)象,替換字符串惑畴,原字符串)替換后原字符串不變蛋欣,返回一個(gè)新的字符串
將指定字符串中的指定的子串替換成其他的字符串
練習(xí):刪除字符串成'andd anbsbabbssasbad'中的'a'和'b'
result = re.sub(r'[ab]', '', 'andd anbsbabbssasbad')
print(result)
練習(xí):將臟話替換成
result = re.sub(r'[媽掛操艸]|智障|sB', '*', '你掛機(jī)了?')
print(result)
補(bǔ)充:正則表達(dá)式中中文的判斷
判斷是否有中文,如果有就打印不合格如贷,沒有就合格
使用中文的unicode編碼范圍:\u4e00-\u9fa5(正則表達(dá)式中Unicode前面需要加'\u')
result = re.search(r'[\u4e00-\u9fa5]', 'jisd好dfs')
print(result)