網(wǎng)站開發(fā)需要什么資質(zhì)百度官方網(wǎng)頁版
目錄
re正則表達(dá)式,一種專門用來匹配目標(biāo)字符串的規(guī)則
re.match(),從頭匹配一個,無則none
re.search(), 不從頭匹配返回一個,無則none
re.findall(), 不從頭匹配,用list返回所有
re分組
re匹配修飾符
re貪婪非貪婪
re切割和替換
re正則表達(dá)式,一種專門用來匹配目標(biāo)字符串的規(guī)則
正則語法 | 描述 |
---|---|
. | 匹配任意1個字符,除了 \n |
\d | 匹配1位數(shù)字,即0-9 |
\D | 匹配1位非數(shù)字 |
\s | 匹配1位空白符:空格、Tab |
\S | 匹配1位非空白符 |
\w | 匹配1位非特殊字符:即a-z、A-Z、0-9、_、漢字 |
\W | 匹配1位特殊字符 |
[列舉字符] | 匹配1個[ ]中列舉的字符:[a-z]表示匹配1個小寫英文字符 |
* | 匹配出現(xiàn)0次或任意次的一個字符:\d* 表示 0個或任意個連續(xù)的數(shù)字 |
+ | 匹配出現(xiàn)1次或任意次的一個字符:\d+ 表示 1個或任意個連續(xù)的數(shù)字 |
? | 匹配出現(xiàn)1次或0次的一個字符:\d+? 表示 1個數(shù)字 |
{m} | 匹配出現(xiàn)m次的字符:\d{3} 表示 連續(xù)3個數(shù)字 |
{m,n} | 匹配出現(xiàn)從m到n次的字符:\d{2,5} 表示連續(xù)2到5個數(shù)字 |
^ | 匹配字符串開頭:^a 表示以a開頭的 |
$ | 匹配字符串結(jié)尾 :b$ 表示以b結(jié)尾 |
[^指定字符] | 匹配除了指定字符以外的所有字符 [^\d]+ 表示除了數(shù)字以外的字符 |
| | 匹配左右任意一個正則表達(dá)式 \d+|\W+ 表示數(shù)字或特殊字符 |
re.match(),從頭匹配一個,無則none
"""
match函數(shù):嘗試從字符串起始位置根據(jù)正則表達(dá)式匹配一個結(jié)果
re.match(pattern正則表達(dá)式, string目標(biāo)字符串)
1.如果不能從起始位置匹配成功,則返回None;
2.如果能從起始位置匹配成功,則返回一個匹配的對象
"""
import re
my_str = 'abc_123_DFG_456_abc'
# 匹配字符串bc(注:從頭開始)
res = re.match('bc', my_str)
print(res) # None# 匹配字符串a(chǎn)bc(注:從頭開始)
res = re.match('abc', my_str)
print(res) # 匹配成功,返回一個 Match 對象
# Match對象.group():獲取匹配的內(nèi)容
print(res.group())
print('-----------')
re.search(), 不從頭匹配返回一個,無則none
"""search函數(shù):根據(jù)正則表達(dá)式掃描整個字符串,并返回第一個成功的匹配
re.search(pattern, string, flags=0)
1. 如果不能匹配成功,則返回None;
2. 如果能匹配成功,則返回一個匹配對象
"""
import re
my_str = 'abc_123_DFG_456_abc'# 匹配連續(xù)的3位數(shù)字 # \d{3}
res = re.search(r'\d{3}', my_str)
print(res.group())
res = re.search(r'bc', my_str)
print(res.group())
re.findall(), 不從頭匹配,用list返回所有
"""findall函數(shù):根據(jù)正則表達(dá)式掃描整個字符串,并返回所有能成功匹配的子串
re.findall(pattern, string, flags=0)
1. 如果不能匹配成功,則返回一個空列表;
2. 如果能匹配成功,則返回包含所有匹配子串的列表
"""
import re
my_str = 'abc_123_DFG_456_abc'# 匹配字符串中的所有連續(xù)的3位數(shù)字
res = re.findall(r'\d{3}', my_str)
print(res)
re分組
import re
"""
示例1:正則匹配分組操作
語法:(正則表達(dá)式)
"""
# 匹配手機(jī)號前3、中4、后4位數(shù)據(jù)
my_str = '13155667788'
# 131 5566 7788
# \d{3}\d{4}\d{4}
# (\d{3})(\d{4})(\d{4})res = re.match(r'(\d{3})(\d{4})(\d{4})', my_str)
print(res)
print(res.group()) # 完整的匹配結(jié)果# Match對象.group(組序號)
print(res.group(1)) # '131'
print(res.group(2)) # '5566'
print(res.group(3)) # '7788'
print('--------------')"""
示例2:給正則分組起別名
語法:(?P<分組別名>正則表達(dá)式)
"""# 需求:使用正則提取出 my_str 字符串中的 `傳智播客` 文本
my_str = '<div><a href="https://www.itcast.cn" target="_blank">傳智播客</a><p>Python</p></div>'res = re.search('<a.*>(?P<text>.*)</a>', my_str)
print(res)
print(res.group()) # 完整匹配結(jié)果
print(res.group(1)) # 根據(jù)組序號取匹配的數(shù)據(jù)
print(res.group('text')) # 根據(jù)組別名取匹配的數(shù)據(jù)"""
示例3:引用正則分組
語法:(?P<分組別名>正則表達(dá)式).*(?P=分組別名)
"""
import re
# 需求: 找到字符串里反復(fù)出現(xiàn)3次的連續(xù)的數(shù)字my_str = 'a123jkfjkfjg123' # ==> None
my_str = '123aq123a123' # ==> 123
my_str = '123123123' # ==> 123
my_str = '123 123123' # ==> 123
res = re.match(r'(?P<num>\d+)\D*(?P=num)\D*(?P=num)$', my_str)if res:print('匹配成功')print(res.group(1))print(res.group('num'))
else:print('匹配失敗')
re匹配修飾符
import re
"""
re.I:匹配時不區(qū)分大小寫
re.M:多行匹配,影響 ^ 和 $
re.S:影響 . 符號,設(shè)置之后,.符號就能匹配\n了
"""# re.I:匹配時不區(qū)分字母的大小寫
my_str = 'aB'
res = re.match('ab', my_str, flags=re.I)
print(res.group())
print('----------------')# re.M:開啟多行匹配模式,把每一行字符串,當(dāng)作一個獨立的字符串進(jìn)行匹配
my_str = 'aabb\nbbcc'
res = re.findall('^[a-z]{4}$', my_str, flags=re.M)
print(res)
res = re.findall('^[a-z]{4}$', my_str)
print(res)
res = re.findall('[a-z]{4}', '11aabb')
print(res)
res = re.findall('^[a-z]{4}$', '11aabb')
# 被匹配的字符串必須以字母開頭以字母結(jié)尾
print(res)
print('----------------')# re.S:讓 . 也能匹配\n
my_str = '\nabc'
res = re.match('.', my_str, flags=re.S)
print(res)# 多模式:flags=re.S|re.M|re.I
my_str = '1111\nabc'
res = re.findall('.', my_str, flags=re.S|re.M|re.I)
print(res)
re貪婪非貪婪
import re
"""
貪婪模式:在整個表達(dá)式匹配成功的前提下,盡可能多的匹配
非貪婪模式:在整個表達(dá)式匹配成功的前提下,盡可能少的匹配
正則中的量詞包括:{m,n}、?、*和+,這些量詞默認(rèn)都是貪婪模式的匹配
可以在這些量詞后面加?將其變?yōu)榉秦澙纺J健?"""
my_str = '<div>test1</div><div>test2</div>'
# 貪婪模式:在整個表達(dá)式匹配成功的前提下,盡可能多的匹配
re_obj = re.match('<div>.*</div>', my_str)
print(re_obj.group()) # 獲取整個正則表達(dá)式匹配的內(nèi)容
print('----')
# 非貪婪模式:在整個表達(dá)式匹配成功的前提下,盡可能少的匹配
re_obj = re.match('<div>.*?</div>', my_str)
print(re_obj.group()) # 獲取整個正則表達(dá)式匹配的內(nèi)容# \d{2,5}? == \d{2} != \d{2,5}
my_str = '221324324324242'
re_obj = re.match('\d{2,5}?', my_str)
print(re_obj.group())
re_obj = re.match('\d{2,5}', my_str)
print(re_obj.group())
re_obj = re.match('\d{2}', my_str)
print(re_obj.group())
re切割和替換
import re
# re.split(pattern, string, maxsplit, flags)
# 作用:對字符串進(jìn)行分割
# 過程:先使用正則對字符串進(jìn)行匹配,正則匹配到的內(nèi)容作為分割符,對字符串進(jìn)行分割
str1 = 'hello-python_hive'
res1 = re.split('[-_]', str1)
print(res1) # ['hello', 'python', 'hive']# re.sub(pattern, repl, string, count, flags)
# 作用:對字符串中的內(nèi)容進(jìn)行替換
# 過程:先使用正則對字符串進(jìn)行匹配,然后將匹配到的內(nèi)容進(jìn)行替換,返回替換之后的新字符串
str2 = 'hello-python_hive' # 'hello:python:hive'
res2 = re.sub('[-_]', ':', str2)
print(res2) # hello:python:hive