匹配字符串

自學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

圖標 (35)

??實例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()方法不僅僅是在字符串的起始位置搜索,其他位置有符合的匹配也可以進行搜索。

圖標 (35)

??實例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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19480.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19480.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19480.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解Redis:多種操作方式詳解

Redis&#xff08;Remote Dictionary Server&#xff09;是一款高性能的開源鍵值存儲系統&#xff0c;廣泛應用于緩存、會話管理、實時分析等領域。它支持多種數據結構&#xff0c;如字符串、哈希、列表、集合和有序集合等&#xff0c;提供了豐富的操作命令。本篇博客將詳細介紹…

信息系統項目管理師0603:項目整合管理 — 考點總結(可直接理解記憶)

點擊查看專欄目錄 文章目錄 項目整合管理 — 考點總結(可直接理解記憶) 輸入、輸出、工具和技術 歷年考題直接考輸入,輸出、工具和技術的有17年11月第34、35,19年5月第34、35,20年11月27、28,21年5月第26,28,21年11月第28,22年5月第25,22年11月第22考題 項目章程是正…

CasaOS玩客云安裝全平臺高速下載器Gopeed并實現遠程訪問

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

BufferQueue 的工作原理

bufferQueue 是 Android 圖形棧中的一個核心組件,它在生產者和消費者之間傳遞緩沖區(buffer)。它通常用于圖形緩沖區管理,特別是在 SurfaceFlinger 和其他圖形相關的組件中。理解 BufferQueue 的工作原理對開發高性能圖形應用和解決圖形渲染問題非常有幫助。 BufferQueue …

基于Python的酒店客房入侵檢測系統的設計與實現

基于Python的酒店客房入侵檢測系統的設計與實現 開發語言:Python 數據庫&#xff1a;MySQL所用到的知識&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 系統功能實現 酒店客房入侵管理界面 結合上文的結構搭建和用戶需求&#xff0c;酒店客房入侵檢測系統的…

【Unity Shader入門精要 第12章】屏幕后處理效果(一)

1. 原理和過程 屏幕后處理是綁定攝像機的&#xff0c;通過抓取當前攝像機渲染的圖像作為 SrcTextrue&#xff0c;然后按需依次調用處理接口&#xff0c;對 SrcTexture 進行處理&#xff0c;最后將處理完成的 DstTexture 顯示到屏幕上&#xff0c;整個過程的調度通過 C# 腳本完…

使用 C++ 在當前進程中獲取指定模塊的基址

C 實現 , 獲取指定模塊在該進程中的基址 1、流程: 獲取進程的所有模塊信息–>遍歷模塊列表 2、實現&#xff1a; // 我自己定義的 typedef struct moudle_date_ {HANDLE mhandle; // 句柄char mname[64]; // 名稱char* date; // 數據DWORD mdword; // 基址…

【機器學習】Adaboost: 強化弱學習器的自適應提升方法

&#x1f308;個人主頁: 鑫寶Code &#x1f525;熱門專欄: 閑話雜談&#xff5c; 炫酷HTML | JavaScript基礎 ?&#x1f4ab;個人格言: "如無必要&#xff0c;勿增實體" 文章目錄 Adaboost: 強化弱學習器的自適應提升方法引言Adaboost基礎概念弱學習器與強學習…

存儲器容量小才使用SRAM芯片,容量較大時使用DRAM芯片。為什么?

在計算機系統中&#xff0c;存儲器容量的選擇涉及到多種因素&#xff0c;包括成本、速度和復雜性。SRAM&#xff08;靜態隨機存取存儲器&#xff09;和DRAM&#xff08;動態隨機存取存儲器&#xff09;是兩種常見的內存類型&#xff0c;它們在設計和應用上有顯著的不同。以下是…

【藍橋杯嵌入式】 第六屆國賽

目錄 題目 配置 注意事項 代碼 - 默寫大師 EEPROM讀寫函數 LED驅動函數 ADC采集 上電初始化 LCD 按鍵 PWM互補輸出 全部代碼 hardware.c hardware.h control.c control.h main.c 題目 配置 注意事項 復制LCD的工程&#xff0c;先配置資源 --- 勾選完選項一…

CCIG 2024:合合信息文檔解析技術突破與應用前景

目錄 背景當前大模型訓練和應用面臨的問題訓練Token耗盡訓練語料質量要求高LLM文檔問答應用中文檔解析不精準 合合信息的文檔解析技術1. 具備多文檔元素識別能力2. 具備版面分析能力3. 高性能的文檔解析4. 高精準、高效率的文檔解析文檔多板式部分示例 文檔解析典型技術難點元素…

【代碼隨想錄Day23】|669.修建二叉搜索樹、108.將有序數組轉換為二叉搜索樹、538.把二叉搜索樹轉換為累加樹

669. 修剪二叉搜索樹 這題最開始的想法是復用刪除節點的那題的思路做&#xff0c;需要修改的部分就是要讓程序刪除完一個點后繼續遍歷&#xff0c;因為后續可能還有不符合條件的節點。但這樣想也做復雜了。 這類題其實不用想用什么序遍歷&#xff0c;用哪種方式只是為了更好的…

案例|開發一個美業小程序,都有什么功能

隨著移動互聯網的迅猛發展&#xff0c;美業連鎖機構紛紛尋求數字化轉型&#xff0c;以小程序為載體&#xff0c;提升服務效率&#xff0c;增強客戶體驗。 線下店現在面臨的困境&#xff1a; 客戶到店排隊時間過長&#xff0c;體驗感受差 新客引流難&#xff0c;老用戶回頭客…

基于EV54Y39A PIC-IOT WA的手指數量檢測功能開發(MPLAB+ADC)

目錄 項目介紹硬件介紹項目設計開發環境及工程參考總體流程圖硬件基本配置光照傳感器讀取定時器檢測邏輯 功能展示項目總結 &#x1f449; 【Funpack3-2】基于EV54Y39A PIC-IOT WA的手指數量檢測功能開發 &#x1f449; Github: EmbeddedCamerata/PIC-IOT_finger_recognition 項…

Flutter基礎 -- Dart 語言 -- 注釋函數表達式

目錄 1. 注釋 1.1 單行注釋 1.2 多行注釋 1.3 文檔注釋 2. 函數 2.1 定義 2.2 可選參數 2.3 可選參數 默認值 2.4 命名參數 默認值 2.5 函數內定義 2.6 Funcation 返回函數對象 2.7 匿名函數 2.8 作用域 3. 操作符 3.1 操作符表 3.2 算術操作符 3.3 相等相關的…

上海亞商投顧:滬指沖高回落 兩市成交金額僅剩7000億

上海亞商投顧前言&#xff1a;無懼大盤漲跌&#xff0c;解密龍虎榜資金&#xff0c;跟蹤一線游資和機構資金動向&#xff0c;識別短期熱點和強勢個股。 一.市場情緒 三大指數昨日沖高回落&#xff0c;午后一度集體翻綠&#xff0c;臨近尾盤小幅回升。光伏產業鏈再度走強&#…

aws 在ecs外部實例上運行gpu負載

參考資料 https://docs.amazonaws.cn/zh_cn/AmazonECS/latest/developerguide/ecs-gpu.htmlhttps://docs.amazonaws.cn/AWSEC2/latest/UserGuide/accelerated-computing-instances.html#gpu-instanceshttps://docs.amazonaws.cn/AWSEC2/latest/UserGuide/install-nvidia-drive…

LeetCode 63.不同路徑Ⅱ

思路&#xff1a; 在有障礙物的地方增加一個判斷即可 class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int dp[105][105];int mobstacleGrid.size();int nobstacleGrid[0].size();for(int i0;i<m;i){for(int j0…

K8s集群之 存儲卷 PV PVC

目錄 默寫 1 如何將pod創建在指定的Node節點上 2 污點的種類(在node上設置) 一 掛載存儲??????? 1 emptyDir存儲卷 2 hostPath存儲卷 ①在 node01 節點上創建掛載目錄 ② 在 node02 節點上創建掛載目錄 ③ 創建 Pod 資源 ④ 在master上檢測一下&#xff1a;…

C++ vector 模擬實現

vector的底層也是一個動態數組&#xff0c;他與 string 的區別就是&#xff0c;string 是專門用來存儲字符類數據的&#xff0c;為了兼容C語言&#xff0c;使用C語言的接口&#xff0c;在string的動態數組內都會都開一塊空間用來存 \0 &#xff0c;而vector則不會。 首先我們要…