1 正則表達式
正則表達式就是做字符串匹配的一種工具收班,很多語法都支持正則語法,正則語法通常是通用的。
python通過re模塊中提供的方法來使用正則表達式
python的正則表達式 -- r'正則':r阻止轉(zhuǎn)義
js正則表達式 -- /正則/
2 正則表達式的字符
2.1 匹配字符
- 普通字符
普通字符在正則中代表字符本身系吩,例如:a, A, 1……等。
re_str = r'hello'
result = re.fullmatch(re_str, 'hello')
print(result)
- .
一個.匹配一個任意字符
re_str = r'a.c' # 要求第二個字符可以是任意字符妒蔚,第一個必須是a,第三個必須是c
result = re.fullmatch(re_str, 'abc')
print(result)
result = re.fullmatch(re_str, 'cbc')
print(result)
- \w
匹配字母淑玫、數(shù)字、下劃線面睛,一個\w只能匹配一個字符絮蒿。
注意:\w并不嚴謹,還可以匹配中文等字符;嚴格來說:不能匹配ASCII碼表中除數(shù)字叁鉴、字母土涝、下劃線以外的符號。
re_str = r'\wabc'
result = re.fullmatch(re_str, 'aabc')
print(result)
result = re.fullmatch(re_str, '&abc')
print(result)
- \s
匹配空白字符
空白字符:空格幌墓、\t, \n但壮;一個\s只能匹配一個空字符
re_str = r'...\s\s...'
result = re.fullmatch(re_str, 'abc \ncba')
print(result)
- \d
匹配數(shù)字
re_str = r'\d\dabc'
result = re.fullmatch(re_str, '12abc')
print(result)
- \W
匹配非數(shù)字、字母常侣、下劃線 - \S
匹配非空白字符
re_str = r'\Sabc'
result = re.fullmatch(re_str, '1abc')
print(result)
- \D
匹配非數(shù)字字符 - []
匹配字符集中的一個字符
[普通字符集] - 蒲培字符集中的任意一個字符
注意:一個中括號只能匹配一個字符
括號中也可以放入其他的匹配字符
[字符1-字符2] -- 匹配字符1到字符2中的任一字符(要求字符1的編碼值小于字符2)
[0-9] 匹配所有數(shù)字
[a-z] 小寫字母
[A-Z] 大寫字母
[a-zA-Z] 字母
[\da-zA-z] - 字母數(shù)字下劃線
[\u4e00-\u9fa5] - 所有中文
[^字符集] - 匹配不在字符集中的任一一個字符
[^\u4e00-\u9fa5] - 匹配非中文字符
[^xyz] - 匹配非xyz
re_str = r'[a-z]abc'
result = re.fullmatch(re_str, '1abc')
print(result)
# 匹配一個長度是4的字符串蜡饵,第一個字符是數(shù)字或者xyz
re_str = r'[\dxyz]abc'
result = re.fullmatch(re_str, '1abc')
print(result)
re_str = r'[\u4e00-\u9fa5]abc'
result = re.fullmatch(re_str,'你abc')
print(result)
2.2 檢測字符
- \b
檢查\b所在的位置是否是單詞的邊界
單詞邊界 -- 字符串開頭、字符串結(jié)尾胳施、空白溯祸,標點符號等
# 匹配一個長度是4的字符串,第一個字符是任意舞肆,后邊是abc焦辅;檢測c的后邊是否是單詞邊界
re_str = r'.abc\b'
print(re.fullmatch(re_str, '8abc'))
re_str = r'how\b are'
print(re.fullmatch(re_str, 'how are')) # 不能匹配,\b不占位置椿胯,需加空格
- ^
檢查是否是字符串開頭 - $
檢測是否是字符串的結(jié)尾
2.3 轉(zhuǎn)義符號
轉(zhuǎn)義符號:在有特殊功能筷登、意義的符號前加'\'
,讓特殊功能的符號變?yōu)槠胀ǚ?br>
注意:除了^放在[]開頭哩盲,和-放在兩個字符之間前方,其他單獨的特殊符號狈醉,在[]中沒有特殊功能,都是表示字符本身.
re_str = r'\d\d.\d\d'
print(re.fullmatch(re_str, '89=78'))
re_str = r'\^\d\d\d'
print(re.fullmatch(re_str, '^789'))
re_str = r'\d\d[.]\d\d'
print(re.fullmatch(re_str, '23=45'))
# ^在[]中惠险,只要不是開頭舔糖,就沒有特殊意義
re_str = r'\d\d[a^]\d\d'
print(re.fullmatch(re_str, '23^45'))
# -在[]中,只要不放在字符之間就沒有特殊意義
re_str = r'\d\d[-a]\d\d'
print(re.fullmatch(re_str, '23-45'))
2.4 匹配次數(shù)
*
-- 匹配0次或多次
字符* -- 指定字符出現(xiàn)0次或者多次
a* -- 字符a匹配0次或多次
\d* -- 數(shù)字出現(xiàn)0次或多次
[a-z]* -- 小寫字母匹配0或多次
+
-- 匹配1次或多次
? -- 0次或1次
{} 指定匹配次數(shù)
{N} -- 匹配N次
{M,N} -- 匹配至少M次莺匠,最多N次
{M,} -- 至少M次
{金吗,N} -- 至多N次
re_str = r'a*bc'
print(re.fullmatch(re_str, 'bc'))
print(re.fullmatch(re_str, 'ac'))
re_str = r'a\d+b'
re_str = r'[+-]?\d*'
print(re.fullmatch(re_str, '0'))
re_str = r'\d{4}'
print(re.fullmatch(re_str, '4444'))
re_str = r'\d{2,4}'
print(re.fullmatch(re_str, '422'))
# 寫一個正則表達式判斷密碼是否復(fù)合要求:
# 密碼由數(shù)字或字母組成,并且第一個字符是大寫字母趣竣,長度是6-12位
# 是否復(fù)合要求返回提示
re_str = r'[A-Z][A-Za-z\d]{5,11}'
a = input('輸入密碼')
if re.fullmatch(re_str, a):
print("密碼復(fù)合要求")
else:
print('密碼不復(fù)合要求')
2.5 分支和分組
- | -- 分支
正則1|正則2 -- 先用正則1進行匹配摇庙,如果匹配失敗再用正則2匹配。正則1和正則2中只要有一個成功就成功遥缕,都失敗則失敗卫袒。
注意:如果正則1匹配成功了,不會使用正則2去匹配
# 匹配一個字符串单匣,開頭是abc或者xyz
re_str = r'abc.*|xyz.*'
print(re.fullmatch(re_str, 'abc'))
- () -- 分組
將部分正則作為一個整體
#整體區(qū)分
re_str = r'(xxx|yyy)[a-z]{2}[a-z]{2}\d{2}'
#整體操作
re_str = r'(\d{2}[a-zA-Z]{2}){3}'
# 整體重復(fù)
# \M -- 重復(fù)前面第M個分組匹配到的內(nèi)容
# 89abc89夕凝,11abc11
re_str = r'(\d\d)abc\1' # \1表示重復(fù)第一個分組
print(re.fullmatch(re_str, '90abc90'))
re_str = r'(\d{3})([a-z]{2})\1\1\2'
2.6 非貪婪
貪婪 - 匹配次數(shù)不確定的時候盡可能多的匹配(以上次數(shù)不確定的符號都是貪婪的)
非貪婪 -- 匹配次數(shù)不確定的時候盡可能少的匹配(次數(shù)不確定符號后加'?')
*? -- 0次或多次,盡可能少
+? -- 1次或多次户秤,盡可能少
?? -- 1次或1次码秉,盡可能掃
{M,N}?
{M,}鸡号?
{转砖,N}?
re_str = r'a+'
print(re.search(re_str,'baaaaac')) # 貪婪
re_str = r'a+?'
print(re.search(re_str,'baaaaac')) # 非貪婪
3 正則的對象方法
- compile(正則表達式)
創(chuàng)建正則表達式對象
re_str = r'\d{3}'
re_obj = compile(re_str)