站長在線零基礎(chǔ)Python完全自學(xué)教程20:在Python中使用正則表達(dá)式完全解讀
歡迎你來到站長學(xué)堂,學(xué)習(xí)站長在線出品的在線課程《零基礎(chǔ) Python完全自學(xué)教程》今天給大家分享的是第20課《 在Python中使用正則表達(dá)式完全解讀》。本節(jié)課是一個大課,我分了這些知識點(diǎn)進(jìn)行詳細(xì)講解:正則表達(dá)式的語法詳解、匹配字符串的3個方法詳解、使用正則表達(dá)式的sub()方法替換字符串詳解、使用正則表達(dá)式的split()方法分割字符串詳解。
永久美國免備案虛擬主機(jī)1元1天,15元1月,100元1年,1000元永久
站長在線旗下答案網(wǎng)站,全站所有題目,免費(fèi)查看答案和答案解析
歡迎你來到站長學(xué)堂,學(xué)習(xí)站長在線出品的在線課程《零基礎(chǔ) python完全自學(xué)教程》今天給大家分享的是第20課《 在Python中使用正則表達(dá)式完全解讀》。本節(jié)課是一個大課,我分了這些知識點(diǎn)進(jìn)行詳細(xì)講解:正則表達(dá)式的語法詳解、匹配字符串的3個方法詳解、使用正則表達(dá)式的sub()方法替換字符串詳解、使用正則表達(dá)式的split()方法分割字符串詳解。
20.1、Python中正則表達(dá)式的語法詳解
關(guān)于Python中的正則表達(dá)式,準(zhǔn)備分兩個知識點(diǎn)講完,今天來講解正則表達(dá)式的語法。
正則表達(dá)式的概念:正則表達(dá)式(regular expression,簡稱regex或者RE),也稱為歸則表達(dá)式。通常用來檢索、替換符合某些規(guī)則的文本。正則表達(dá)式就是記錄文本規(guī)則的代碼。
20.1.1、行定位符
行定位符就是用來描述字符串的邊界?!癪”表示行的開始;“$”表示行的結(jié)尾。
例如:
One is All
All is One
^One
該表達(dá)式表示要匹配字符串One的開始位置是行頭,如One is All就可以匹配,而All is One則不匹配。但如果使用:
One$
則All is One可以匹配,而One is All不能匹配。如果要匹配的字符串可以出現(xiàn)在字符串的任意部分,那么可以直接寫成:
One
這樣,兩個字符串就都可以匹配了。
20.1.2、元字符
元字符就是在正則表達(dá)式中具有特殊意義的專用字符。
剛才我們所說的“^”和“$”就是元字符,在Python有下面常用元字符:.、\w、\W、\s、\S、\d、\D、\b、^、$。
各種元字符及其說明如下:
.:匹配除換行符以外的任意字符
\W:匹配特殊字符,即非字母、非數(shù)字、非漢字
\s:匹配任意的空白符
\S:匹配非空白
\d:匹配數(shù)字
\D:匹配非數(shù)字,即不是數(shù)字
\b:匹配單詞的開始或結(jié)束
^:匹配字符串的開始
$:匹配字符串的結(jié)束
我們來看一個例子:
\byi\w*\b
匹配以字母yi開頭的單詞,先匹配單詞開始處(\b),然后匹配字母yi,接著匹配任意數(shù)量的字母或數(shù)字(\w*),最后匹配單詞結(jié)束處(\b)。該表達(dá)式可以匹配如“yibenshu”“saneryi”“haoyige”“yi12345”等。
20.1.3、限定符
在上面的元字符的例子中,使用“\w*”匹配任意數(shù)量的字母或數(shù)字。如果想匹配特定數(shù)量的數(shù)字,該如何表示呢?正則表達(dá)式為我們提供了限定符(指定數(shù)量的字符)來實(shí)現(xiàn)該功能。
例如,匹配6位QQ號可用如下表達(dá)式:
^\d{6}$
常用的限定符如下所示:*、+、?、{n} 、{n,}、{n,m}、[] 。
各種限定符及說明及舉例如下:
* :匹配前面的字符零次或更多次。例如“zo*”能匹配“z” “zo”以及“zoo”,“*”等效于“{0,}”
+ :匹配前面的字符一次或更多次。例如“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”,“+”等效于"{1,}”
? :匹配前面的字符零次或一次。例如“do(es)?”可以匹配 “do”或 “does”中的“do”,“?”等效 于 “{0,1}”
{n} :匹配前面的字符n次。例如“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food” 中的兩個 o
{n,} :匹配前面的字符n次或更多次。例如“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o, 等效于“o+”,“o{0,}”則等效于“o*”
{n,m} :匹配前面的字符n到m次。其中 n<=m。最少匹配 n 次且最多匹配 m 次。例如“o{1,3}”將匹配“fooooood" 中的前三個“o”,“o{0,l}”等效于“0?”。注意在逗號和兩個數(shù)之間不能有空格
20.1.4、字符集
正則表達(dá)式查找數(shù)字和字母是很簡單的,因?yàn)橐呀?jīng)有了對應(yīng)這些字符集合的元字符(如\d,\w),但是如果要匹配沒有預(yù)定義元字符的字符集合(比如元音字母a, e, i, o, u),應(yīng)該怎么辦?很簡單,只需要在方括號里列出它們就行了,像[aeiou]就匹配任何一個英文元音字母。
[xyz]表示匹配里面的任意一個字符。
[a-z]字符范圍,匹配指定范圍內(nèi)的任意字符。例如“[a-z]”可以匹配“a”到“z”范圍內(nèi)的任意小寫字母字符
[.?!]匹配標(biāo)點(diǎn)符號“.”、“?”或“!”。也可以輕松地指定一個字符范圍,像[0-9]代表的含義與\d就是完全一致的:代表一位數(shù)字;同理,[a-z0-9A-Z_]也完全等同于\w(如果只考慮英文的話)。
要想匹配給定字符串中任意一個漢字,可以使用[\u4e00-\u9fa5];如果要匹配連續(xù)多個漢字,可以使用[\u4e00-\u9fa5]+。
20.1.5、排除字符
上方的字符集是匹配符合指定字符集的字符串。這里的排除字符,剛剛相反。排除字符就是匹配不符合指定字符集的字符串。在正則表達(dá)式中用“^”表示。我們在最開始的行定位符中也說到了“^”,放在開頭,在這里放在方括號[]里面,表示排除的意思。如:
[^a-zA-Z]
表示用于一個匹配非字母的字符。
20.1.6、選擇字符
Python中的選擇字符,包含著條件選擇的邏輯,在這里使用“|”來表示。該字符可以理解為“或”。
如中國人的身份證號碼長度為15位或者18位。如果為15位,則全為數(shù)字;如果為18位,前17位為數(shù)字,最后一位是校驗(yàn)位,可能為數(shù)字或字符X。
匹配身份證的表達(dá)式可以寫出如下方式:
(^\d{15}$)|(^\d{18}$)|(^\d{17})(\d|X|x)$
該表達(dá)式的意思是可以匹配15位數(shù)字,或者18位數(shù)字,或者17位數(shù)字和最后一位。最后一位可以是數(shù)字或者是X或者是x。
20.1.7、轉(zhuǎn)移字符
正則表達(dá)式中的轉(zhuǎn)義字符(\)和Python中的大同小異,都是將特殊字符(如“.”“?”“\”等)變?yōu)槠胀ǖ淖址?/p>
舉一個IP地址的實(shí)例,用正則表達(dá)式匹配如127.0.0.1這樣格式的IP地址。如果直接使用點(diǎn)字符,格式為:
[1-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}
這顯然不對,因?yàn)椤?”可以匹配一個任意字符。這時,不僅是127.0.0.1這樣的IP,連127101011這樣的字串也會被匹配出來。所以在使用“.”時,需要使用轉(zhuǎn)義字符(\)。修改后,上面的正則表達(dá)式格式為:
[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
站長在線提醒你:括號在正則表達(dá)式中也算是一個元字符。
20.1.8、分組
通過上面選擇字符中的例子,可以看見小括號的作用有了一定的了解。
小括號字符的第一個作用就是可以改變限定符的作用范圍,如“|”“*”“^”等。來看下面的一個表達(dá)式。
(mon|ma)th
這個表達(dá)式的意思是匹配單詞month或math,如果不使用小括號,那么就變成了匹配單詞mon和math了。
小括號的第二個作用是分組,也就是子表達(dá)式。例如(\.[0-9]{1,3}){3},就是對分組(\.[0-9]{1,3})進(jìn)行重復(fù)操作。
20.1.9、在Python中使用正則表達(dá)式語法
在Python中使用正則表達(dá)式時,是將其作為模式字符串使用的。例如,將匹配不是字母的一個字符的正則表達(dá)式表示為模式字符串,可以使用下面的代碼:
'[^a-zA-Z]'
而如果將匹配以字母m開頭的單詞的正則表達(dá)式轉(zhuǎn)換為模式字符串,則不能直接在其兩側(cè)添加引號定界符,例如,下面的代碼是不正確的。
'\bm\w*\b'
而是需要將其中的“\”進(jìn)行轉(zhuǎn)義,轉(zhuǎn)換后的代碼為:
'\\bm\\w*\\b'
由于模式字符串中可能包括大量的特殊字符和反斜杠,所以需要寫為原生字符串,即在模式字符串前加r或R。例如,上面的模式字符串采用原生字符串表示就是:
r'\bm\w*\b'
在編寫模式字符串時,并不是所有的反斜杠都需要進(jìn)行轉(zhuǎn)換。例如,前面編寫的正則表達(dá)式“^\d{6}$”中的反斜杠就不需要轉(zhuǎn)義,因?yàn)槠渲械腬d并沒有特殊意義。不過,為了編寫方便,本教程所寫正則表達(dá)式都采用原生字符串表示。
20.2、在Python中匹配字符串的3個方法詳解
匹配字符串可以使用re模塊提供的match()、search()和findall()等方法。下面分別進(jìn)行介紹。
20.2.1、使用match()方法進(jìn)行匹配
match()方法用于從字符串的開始處進(jìn)行匹配,如果在起始位置匹配成功,則返回Match對象,否則返回None。其語法格式如下:
re.match(pattern, string, [flags])
其中,相關(guān)參數(shù)說明如下:
pattern:表示模式字符串,由要匹配的正則表達(dá)式轉(zhuǎn)換而來。
string:表示要匹配的字符串。
flags:可選參數(shù),表示標(biāo)志位,用于控制匹配方式,如是否區(qū)分字母大小寫。
常用的標(biāo)志位及其說明:
re.A或ASCII 對于\w、\w、\b、\B、\d、\B、\d、\D、]s、\S進(jìn)行ASCII匹配(僅適用于Python3)
re.I或IGNORECASE 使匹配對大小寫不敏感
re.L 做本地化識別(locale-aware)匹配
re.M或MULTILINE 多行匹配,影響 ^ 和 $
re.S或DOTALL 使 . 匹配包括換行在內(nèi)的所有字符
re.U或UNicoDE 根據(jù)Unicode字符集解析字符。這個標(biāo)志影響 \w, \W, \b, \B.
re.X或VERBOSE 該標(biāo)志通過給予你更靈活的格式以便你將正則表達(dá)式寫得更易于理解。
例如,匹配字符串是否以“zz_”開頭,不區(qū)分字母大小寫,代碼如下:
import re
pattern = r'zz_\w+' # 模式字符串
string = 'ZZ_MALL zz_mall' # 要匹配的字符串
match = re.match(pattern,string,re.I) # 匹配字符串,不區(qū)分大小寫
print(match) # 輸出匹配結(jié)果
string = '項(xiàng)目名稱 ZZ_MALL zz_mall' # 要匹配的字符串
match = re.match(pattern,string,re.I) # 匹配字符串,不區(qū)分大小寫
print(match) # 輸出匹配結(jié)果
運(yùn)行結(jié)果如下:
<re.Match object; span=(0, 7), match='ZZ_MALL'>
None
>>>
從上面的執(zhí)行結(jié)果中可以看出,字符串“ZZ_MALL”是以“zz_”開頭,所以返回一個Match對象,而字符串“項(xiàng)目名稱 ZZ_MALL zz_mall”不是以“zz_”開頭,所以返回None。這是因?yàn)閙atch()方法從字符串的開始位置開始匹配,當(dāng)?shù)谝粋€字母不符合條件時,則不再進(jìn)行匹配,直接返回None。
Match對象中包含了匹配值的位置和匹配數(shù)據(jù)。其中,要獲取匹配值的起始位置可以使用Match對象的start()方法;要獲取匹配值的結(jié)束位置可以使用end()方法;通過span()方法可以返回匹配位置的元組;通過string屬性可以獲取要匹配的字符串。例如下面的代碼:
import re
pattern = r'zz_\w+' # 模式字符串
string = 'ZZ_MALL zz_mall' # 要匹配的字符串
match = re.match(pattern,string,re.I) # 匹配字符串,不區(qū)分大小寫
print('匹配值的起始位置: ',match.start())
print('匹配值的結(jié)束位置: ',match.end())
print('匹配位置的元組: ',match.span())
print('要匹配的字符串: ',match.string)
print('匹配數(shù)據(jù): ',match.group())
運(yùn)行結(jié)果如下:
匹配值的起始位置: 0
匹配值的結(jié)束位置: 7
匹配位置的元組: (0, 7)
要匹配的字符串: ZZ_MALL zz_mall
匹配數(shù)據(jù): ZZ_MALL
>>>
下面實(shí)例,講解一個判定的手機(jī)號碼是不是有效的中國移動的號碼。
import re # 導(dǎo)入Python的re模塊
pattern = r'(13[4-9]\d{8})|(15[01289]\d{8})$'
mobile = '13800000000'
match = re.match(pattern,mobile) # 進(jìn)行模式匹配
if match == None: # 判斷是否為None,為真表示匹配失敗
print(mobile,'不是有效的中國移動手機(jī)號碼。')
else:
print(mobile,'是有效的中國移動手機(jī)號碼。')
mobile = '13100000000'
match = re.match(pattern,mobile) # 進(jìn)行模式匹配
if match == None: # 判斷是否為None,為真表示匹配失敗
print(mobile,'不是有效的中國移動手機(jī)號碼。')
else:
print(mobile,'是有效的中國移動手機(jī)號碼。')
運(yùn)行結(jié)果如下:
13800000000 是有效的中國移動手機(jī)號碼。
13100000000 不是有效的中國移動手機(jī)號碼。
>>>
20.2.2、使用search()方法進(jìn)行匹配
search()方法用于在整個字符串中搜索第一個匹配的值,如果在起始位置匹配成功,則返回Match對象,否則返回None。其語法格式如下:
re.search(pattern, string, [flags])
其中,相關(guān)參數(shù)說明如下:
pattern:表示模式字符串,由要匹配的正則表達(dá)式轉(zhuǎn)換而來。
string:表示要匹配的字符串。
flags:可選參數(shù),表示標(biāo)志位,用于控制匹配方式,如是否區(qū)分字母大小寫。常用的標(biāo)志前面說了。
例如,搜索第一個以“zz_”開頭的字符串,不區(qū)分字母大小寫,代碼如下:
import re
pattern = r'zz_\w+' # 模式字符串
string = 'ZZ_MALL zz_mall' # 要匹配的字符串
match = re.search(pattern,string,re.I) # 匹配字符串,不區(qū)分大小寫
print(match) # 輸出匹配結(jié)果
string = '項(xiàng)目名稱 ZZ_MALL zz_mall' # 要匹配的字符串
match = re.search(pattern,string,re.I) # 匹配字符串,不區(qū)分大小寫
print(match) # 輸出匹配結(jié)果
運(yùn)行結(jié)果如下:
<re.Match object; span=(0, 7), match='ZZ_MALL'>
<re.Match object; span=(5, 12), match='ZZ_MALL'>
>>>
20.2.3、使用findall()方法進(jìn)行匹配
findall()方法用于在整個字符串中搜索所有符合正則表達(dá)式的字符串,并以列表的形式返回。如果匹配成功,則返回包含匹配結(jié)構(gòu)的列表,否則返回空列表。其語法格式如下:
re.findall(pattern, string, [flags])
其中,相關(guān)參數(shù)說明如下:
pattern:表示模式字符串,由要匹配的正則表達(dá)式轉(zhuǎn)換而來。
string:表示要匹配的字符串。
flags:可選參數(shù),表示標(biāo)志位,用于控制匹配方式,如是否區(qū)分字母大小寫。常用的標(biāo)志上面有了。
例如,搜索以“zz_”開頭的字符串,不區(qū)分字母大小寫,代碼如下:
import re
pattern = r'zz_\w+' # 模式字符串
string = 'ZZ_MALL zz_mall' # 要匹配的字符串
match = re.findall(pattern,string,re.I)# 匹配字符串,不區(qū)分大小寫
print(match) # 輸出匹配結(jié)果
string = '項(xiàng)目名稱 ZZ_MALL zz_mall' # 要匹配的字符串
match = re.findall(pattern,string) # 匹配字符串,區(qū)分大小寫
print(match) # 輸出匹配結(jié)果
運(yùn)行結(jié)果為:
['ZZ_MALL', 'zz_mall']
['zz_mall']
>>>
上方下面這個結(jié)果只有一個,因?yàn)槲沂褂昧四J(rèn)的設(shè)置,進(jìn)行區(qū)分大小寫了。
20.3、在Python中使用正則表達(dá)式的sub()方法替換字符串詳解
在Python中使用正則表達(dá)式的sub()方法替換字符串。其語法格式如下:
re.sub(pattern, repl, string, count=0, flags=0)
參數(shù)說明如下:
pattern:表示模式字符串,由要匹配的正則表達(dá)式轉(zhuǎn)換而來。
repl:表示替換的字符串。
string:表示要被查找替換的原始字符串。
count:可選參數(shù),表示模式匹配后替換的最大次數(shù),默認(rèn)值為0,表示替換所有的匹配。
flags:可選參數(shù),表示標(biāo)志位,用于控制匹配方式,如是否區(qū)分字母大小寫。
例如:
import re
a = re.sub(r'hello', '你好', 'hello Python')
print(a)
運(yùn)行結(jié)果如下:
你好 Python
>>>
我們再來看一個替換的例子:
import re
def replace_num(str):
numDict = {'0':'〇','1':'一','2':'二','3':'三','4':'四','5':'五','6':'六','7':'七','8':'八','9':'九'}
print(str.group())
return numDict[str.group()]
my_str = '2021年12月10號'
a = re.sub(r'(\d)', replace_num, my_str)
print(a) #每次匹配一個數(shù)字,執(zhí)行函數(shù),獲取替換后的值
運(yùn)行結(jié)果為:
2
0
2
1
1
2
1
0
二〇二一年一二月一〇號
>>>
好了,到此為止,在Python中使用正則表達(dá)式的sub()方法替換字符串詳解就講解完畢了,本知識點(diǎn)內(nèi)容比較少,希望不會難到大家。
20.4、在Python中使用正則表達(dá)式的split()方法分割字符串詳解
使用正則表達(dá)式分割字符串
在Python中使用正則表達(dá)式的split()方法用于實(shí)現(xiàn)根據(jù)正則表達(dá)式分割字符串,并以列表的形式返回。其作用與《在Python中使用split()方法分割、使用join()方法合并字符串詳解》介紹的字符串對象的split()方法類似,所不同的就是分割字符由模式字符串指定。其語法格式如下:
re.split(pattern, string, [maxsplit], [flags])
其中,相關(guān)參數(shù)說明如下:
pattern:表示模式字符串,由要匹配的正則表達(dá)式轉(zhuǎn)換而來。
string:表示要匹配的字符串。
maxsplit:可選參數(shù),表示最大的拆分次數(shù)。
flags:可選參數(shù),表示標(biāo)志位,用于控制匹配方式,如是否區(qū)分字母大小寫。
示例代碼:
import re
pattern = r'/' # 定義分隔符
URL = 'WWW.olzz.com/xuetang/python' # 需要拆分的字符串
result = re.split(pattern, url) # 以pattern的值 分割字符串
print(result)
運(yùn)行結(jié)果為:
['www.olzz.com', 'xuetang', 'python']
>>>
到此為止,在Python中使用正則表達(dá)式的split()方法分割字符串詳解,就講解完畢了,有不懂的可以留言哦!
相關(guān)閱讀:
站長百科詞條:Python (知識匯總)
9、Python中運(yùn)算符的優(yōu)先級和條件表達(dá)式
11、Python中的選擇語句
13、Python中的break語句、continue語句和pass語句
15、Python中的列表
本文地址:http://003188.cn/pythonzhengzebiaodashi.html
阿里云虛擬主機(jī)1G空間,120元一年
香港、美國虛擬主機(jī)100元一年,1000元永久
騰訊云雙十一0.4折起,2核8G5M三年僅700元,2核4G8M三年僅198元
猜你喜歡