Python 速查手冊- 12.1 正規運算式re - 程式語言教學誌

文章推薦指數: 80 %
投票人數:10人

正規運算式(regular expression) 常用在對文件進行解析,例如做網路爬蟲去爬網路上的HTML 文件,從中取得所欲取得之資訊,或是針對文件檔案進行處理。

Python 中做正規 ... Python速查手冊 12.1正規運算式re 正規運算式(regularexpression)常用在對文件進行解析,例如做網路爬蟲去爬網路上的HTML文件,從中取得所欲取得之資訊,或是針對文件檔案進行處理。

Python中做正規運算式的模組為re,首先要設定好配對形式(pattern)字串(string),然後以該配對形式字串與所欲處理之字串利用re中相關功能的函數(function)進行處理。

配對形式字串通常會用以r開始的原始字串(rawstring),例如r"str"。

此外,配對形式字串需要用到很多中介字元(metacharacter),如下 .^$*+?{}[]\|() 使用原始字串的原因是避免在字串中出現過多的反斜線,因為反斜線在字串中預設為跳脫序列(escapesequence),像是"\\\\"為反斜線\的配對形式字串。

下表為中介字元的說明 中介字元說明 .除了新行符號外的任何字元,例如'.'配對除了'\n'之外的任何字元。

^字串開頭的子字串或排除指定字元或群組,例如'a[^b]c'配對除了'abc'之外的任何a開頭c結尾的三字元組合。

$字串結尾的子字串,例如'abc$'配對以'abc'結尾的字串。

*單一字元或群組出現任意次數,例如'ab*'配對'a'、'ab'或'abb'等等。

+單一字元或群組出現至少一次,例如'ab+'配對'ab'或'abb'等等。

?單一字元或群組0或1次,例如'ab+'配對'a'或'ab'。

{m,n}單一字元或群組的m到n倍數,例如'a{6}'為連續六個'a','a{3,6}'為三到六個'a'。

[]對中括弧內的字元形成集合,例如'[a-z]'為所有英文小寫字母。

\特別序列的起始字元。

|單一字元或群組的或,例如'a|b'為'a'或'b'。

()對小括弧內的字元形成群組。

以下為特別序列的說明 特別序列說明 \number群組的序數 \A字串的開頭字元。

\b作為單字的界線字元,例如r'\bfoo\b'配對'foo'或'barfoobaz'。

\B作為字元的界線字元,例如r'py\B'配對'python'或'py3'。

\d數字,從0到9。

\D非數字。

\s各種空白符號,包括新行符號\n。

\S非空白符號。

\w任意文字字元,包括數字。

\W非文字字元,包括空白符號。

\Z字串的結尾字元。

re中有很多函數,以下列舉一些常用的函數 函數說明 compile(pattern)以配對形式字串pattern當參數,回傳re.compile()物件。

search(pattern,string,flags=0)從string中找尋第一個配對形式字串pattern,找到回傳配對物件,沒有找到回傳None。

match(pattern,string,flags=0)判斷配對形式字串pattern是否與string的開頭相符,如果相符就回傳配對物件,不相符就回傳None。

fullmatch(pattern,string,flags=0)判斷string是否與配對形式字串pattern完全相符,如果完全相符就回傳配對物件,不完全相符就回傳None。

split(pattern,string,maxsplit=0,flags=0)將string以配對形式字串pattern拆解,結果回傳拆解後的串列。

findall(pattern,string,flags=0)從string中找到所有的pattern,結果回傳所有pattern的串列。

finditer(pattern,string,flags=0)從string中找到所有的pattern,結果回傳所有pattern的迭代器。

sub(pattern,repl,string,count=0,flags=0)依據pattern及repl對string進行處理,結果回傳處理過的新字串。

subn(pattern,repl,string,count=0,flags=0)依據pattern及repl對string進行處理,結果回傳處理過的序對。

escape(pattern)將pattern中的特殊字元加入反斜線,結果回傳新字串。

purge()清除正規運算式的內部緩存。

以上參數flag可依據需要用re的內建常數進行設定,細節請參考官方文件的ThePythonStandardLibrary-6.2.re—Regularexpressionoperations。

re.compile()物件的方法大致與以上函數類似。

其中配對物件(matchobject)有以下常用的方法 方法說明 group([group1,...])回傳依據配對形式字串所符合的子字串。

groups(default=None)回傳依據配對形式字串所符合的序對。

groupdict(default=None)回傳依據配對形式字串所符合的字典。

start([group])回傳依據配對形式字串所符合的起始索引值。

end([group])回傳依據配對形式字串所符合的結束索引值。

span([group])回傳(m.start(group),m.end(group))。

由於配對物件的布林值為true,而search()或match()等函數在沒有得到配對結果的時候會回傳None,因此可把search()或match()等當成布林函數,如果回傳為真才進行處理,例如以下程式可判斷是否為Python檔案 importsys importre try: filename=sys.argv[1] pattern=r"[a-zA-Z0-9]+(.py)" ifre.fullmatch(pattern,filename): print("是Python檔案..") else: print("不是Python檔案..") except: print("未提供檔案名稱..") #《程式語言教學誌》的範例程式 #http://kaiching.org/ #檔名:redemo.py #功能:示範re模組 #作者:張凱慶 於命令列執行以上程式 $python3redemo.pytest.py 是Python檔案.. $ 這裡,filename是利用sys模組取得python指令之後接的命令列參數,argv[0]為所執行的Python模組檔案,因此argv[1]為模組檔案後的參數,也就是執行模組檔案後空一格所接的文字,由以上命令列執行接的是test.py filename=sys.argv[1] 下一行配對字串是所有英文字母及數字的組合,加上.py的副檔名 pattern=r"[a-zA-Z0-9]+(.py)" 最後用if陳述利用fullmatch()函數判斷pattern與filename是否完全吻合,然後印出相對應的訊息 ifre.fullmatch(pattern,filename): 如果是英文字母與數字以外的Python檔案名稱,用此例的程式碼都會判斷為「不是Python檔案..」。

相關教學影片 Python標準程式庫的正規運算式re⇨YouTube頁面連結 上一頁:單元12-標準程式庫導覽 Python速查手冊-目錄 下一頁:12.2時間日期處理datatime 回Python教材首頁 回程式語言教材首頁



請為這篇文章評分?