自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501
Python提供了re模塊,用于實現正則表達式的操作。在實現時,可以使用re模塊提供的方法(如search()、match()、findall()等)進行字符串處理,也可以先使用re模塊的compile()方法將模式字符串轉換為正則表達式對象,然后再使用該正則表達式對象的相關方法來操作字符串。
re模塊在使用時,需要先應用import語句引入,具體代碼如下:
import?re
如果在使用re模塊時,沒有將其引入,將拋出如圖21所示的異常。
圖21??未引入re模塊異常
匹配字符串可以使用re模塊提供的match()、search()和findall()等方法。
(1)使用match()方法進行匹配
match()方法用于從字符串的開始處進行匹配,如果在起始位置匹配成功,則返回Match對象,否則返回None。其語法格式如下:
re.match(pattern, string, [flags])
參數說明:
l??pattern:表示模式字符串,由要匹配的正則表達式轉換而來。
l??string:表示要匹配的字符串。
l??flags:可選參數,表示標志位,用于控制匹配方式,如是否區分字母大小寫。常用的標志如表5所示。
表5??常用標志
標????志 | 說????明 |
A或ASCII | 對于\w、\W、\b、\B、\d、\D、\s和\S只進行ASCII匹配(僅適用于Python 3.x) |
I或IGNORECASE | 執行不區分字母大小寫的匹配 |
M或MULTILINE | 將^和$用于包括整個字符串的開始和結尾的每一行(默認情況下,僅適用于整個字符串的開始和結尾處) |
S或DOTALL | 使用(.)字符匹配所有字符,包括換行符 |
X或VERBOSE | 忽略模式字符串中未轉義的空格和注釋 |
例如,匹配字符串是否以“mr_”開頭,不區分字母大小寫,代碼如下:
import?re
pattern =?r'mr_\w+'????????????????????????#?模式字符串
string =?'MR_SHOP mr_shop'??????????????????#?要匹配的字符串
match = re.match(pattern,string,re.I)??????#?匹配字符串,不區分大小寫
print(match)??????????????????????????????????#?輸出匹配結果
string =?'項目名稱MR_SHOP mr_shop'
match = re.match(pattern,string,re.I)??????#?匹配字符串,不區分大小寫
print(match)??????????????????????????????????#?輸出匹配結果
執行結果如下:
<_sre.SRE_Match object; span=(0, 7), match='MR_SHOP'>
None
從上面的執行結果中可以看出,字符串“MR_SHOP”以“mr_”開頭,將返回一個Match對象,而字符串“項目名稱MR_SHOP”沒有以“mr_”開頭,將返回“None”。這是因為match()方法從字符串的開始位置開始匹配,當第一個字母不符合條件時,則不再進行匹配,直接返回None。
Match對象中包含了匹配值的位置和匹配數據。其中,要獲取匹配值的起始位置可以使用Match對象的start()方法;要獲取匹配值的結束位置可以使用end()方法;通過span()方法可以返回匹配位置的元組;通過string屬性可以獲取要匹配的字符串。例如下面的代碼:
import?re
pattern =?r'mr_\w+'???????????????????????????????#?模式字符串
string =?'MR_SHOP mr_shop'??????????????????????#?要匹配的字符串
match = re.match(pattern,string,re.I)??????????#?匹配字符串,不區分大小寫
print('匹配值的起始位置:',match.start())
print('匹配值的結束位置:',match.end())
print('匹配位置的元組:',match.span())
print('要匹配的字符串:',match.string)
print('匹配數據:',match.group())
執行結果如下:
匹配值的起始位置:?0
匹配值的結束位置:?7
匹配位置的元組:?(0, 7)
要匹配字符串:?MR_SHOP mr_shop
匹配數據:?MR_SHOP
??實例07??驗證輸入的手機號碼是否為中國移動的號碼
在IDLE中創建一個名稱為checkmobile.py的文件,然后在該文件中導入Python的re模塊,再定義一個驗證手機號碼的模式字符串,最后應用該模式字符串驗證兩個手機號碼,并輸出驗證結果,代碼如下:
import?re?????????????????????????????????????????#?導入Python的re模塊
pattern =?r'(13[4-9]\d{8})$|(15[01289]\d{8})$'
mobile =?'13634222222'
match = re.match(pattern, mobile)??????????????#?進行模式匹配
if?match ==?None:????????????????????????????????#?判斷是否為None,為真表示匹配失敗
????print(mobile,?'不是有效的中國移動手機號碼。')
else:
????print(mobile,?'是有效的中國移動手機號碼。')
mobile =?'13144222221'
match = re.match(pattern, mobile)???????????????#?進行模式匹配
if?match ==?None:?????????????????????????????????#?判斷是否為None,為真表示匹配失敗
????print(mobile,?'不是有效的中國移動手機號碼。')
else:
????print(mobile,?'是有效的中國移動手機號碼。')
運行實例,將顯示如圖22所示的結果。
圖22??驗證輸入的手機號碼是否為中國移動的號碼
(2)使用search()方法進行匹配
search()方法用于在整個字符串中搜索第一個匹配的值,如果匹配成功,則返回Match對象,否則返回None。search()方法的語法格式如下:
re.search(pattern, string, [flags])
參數說明:
l??pattern:表示模式字符串,由要匹配的正則表達式轉換而來。
l??string:表示要匹配的字符串。
l??flags:可選參數,表示標志位,用于控制匹配方式,如是否區分字母大小寫。常用的標志如表5所示。
例如,搜索第一個以“mr_”開頭的字符串,不區分字母大小寫,代碼如下:
import?re
pattern =?r'mr_\w+'??????????????????????????????#?模式字符串
string =?'MR_SHOP mr_shop'??????????????????????#?要匹配的字符串
match = re.search(pattern,string,re.I)??????????#?搜索字符串,不區分大小寫
print(match)??????????????????????????????????????#?輸出匹配結果
string =?'項目名稱MR_SHOP mr_shop'
match = re.search(pattern,string,re.I)??????????#?搜索字符串,不區分大小寫
print(match)??????????????????????????????????????#?輸出匹配結果
執行結果如下:
<_sre.SRE_Match object; span=(0, 7), match='MR_SHOP'>
<_sre.SRE_Match object; span=(4, 11), match='MR_SHOP'>
從上面的運行結果中可以看出,search()方法不僅僅是在字符串的起始位置搜索,其他位置有符合的匹配也可以進行搜索。
??實例08??驗證是否出現危險字符
在IDLE中創建一個名稱為checktnt.py的文件,然后在該文件中導入Python的re模塊,再定義一個驗證危險字符的模式字符串,最后應用該模式字符串驗證兩段文字,并輸出驗證結果,代碼如下:
import?re????????????????????????????????????#?導入Python的re模塊
pattern =?r'(黑客)|(抓包)|(監聽)|(Trojan)'???????#?模式字符串
about =?'我是一名程序員,我喜歡看黑客方面的圖書,想研究一下Trojan。'
match = re.search(pattern, about)????????????#?進行模式匹配
if?match ==?None:????????????????????????????????#?判斷是否為None,為真表示匹配失敗
????print(about,?'@?安全!')
else:
????print(about,?'@?出現了危險詞匯!')
about =?'我是一名程序員,我喜歡看計算機網絡方面的圖書,喜歡開發網站。'
match = re.match(pattern, about)???????????????#?進行模式匹配
if?match ==?None:?????????????????????????#?判斷是否為None,為真表示匹配失敗
????print(about,?'@?安全!')
else:
????print(about,?'@?出現了危險詞匯!')
運行實例,將顯示如圖23所示的結果。
圖23??驗證是否出現危險字符
(3)使用findall()方法進行匹配
findall()方法用于在整個字符串中搜索所有符合正則表達式的字符串,并以列表的形式返回。如果匹配成功,則返回包含匹配結構的列表,否則返回空列表。findall()方法的語法格式如下:
re.findall(pattern, string, [flags])
參數說明:
l??pattern:表示模式字符串,由要匹配的正則表達式轉換而來。
l??string:表示要匹配的字符串。
l??flags:可選參數,表示標志位,用于控制匹配方式,如是否區分字母大小寫。常用的標志如表5所示。
例如,搜索以“mr_”開頭的字符串,代碼如下:
import?re
pattern =?r'mr_\w+'????????????????????????????#?模式字符串
string =?'MR_SHOP mr_shop'????????????????????#?要匹配的字符串
match = re.findall(pattern,string,re.I)??????#?搜索字符串,不區分大小寫
print(match)??????????????????????????????????#?輸出匹配結果
string =?'項目名稱MR_SHOP mr_shop'
match = re.findall(pattern,string)????????????#?搜索字符串,區分大小寫
print(match)?????????????????????????????????#?輸出匹配結果
執行結果如下:
['MR_SHOP', 'mr_shop']
['mr_shop']
如果在指定的模式字符串中,包含分組,則返回與分組匹配的文本列表。例如,
import?re
pattern =?r'[1-9]{1,3}(\.[0-9]{1,3}){3}'?????#?模式字符串
str1 =?'127.0.0.1 192.168.1.66'???????????????#?要配置的字符串
match = re.findall(pattern,str1)??????????????#?進行模式匹配
print(match)
上面代碼的執行結果如下:
['.1', '.66']
從上面的結果中可以看出,并沒有得到匹配的IP地址,這是因為在模式字符串中出現了分組,所以得到的結果是根據分組進行匹配的結果,即“(\.[0-9]{1,3})”匹配的結果。如果想獲取整個模式字符串的匹配,可以將整個模式字符串使用一對小括號進行分組,然后在獲取結果時,只取返回值列表的每個元素(是一個元組)的第1個元素。代碼如下:
import?re
pattern =?r'([1-9]{1,3}(\.[0-9]{1,3}){3})'?????????#?模式字符串
str1 =?'127.0.0.1 192.168.1.66'????????????????????#?要配置的字符串
match = re.findall(pattern,str1)???????????????????#?進行模式匹配
for?item?in?match:
????print(item[0])
執行結果如下:
127.0.0.1
192.168.1.66