Python 速查手冊- 12.1 正規運算式re - 程式語言教學誌
文章推薦指數: 80 %
正規運算式(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教材首頁
回程式語言教材首頁
延伸文章資訊
- 1Python 正規表示式教程| D棧
Tutorial of Python Regular Expression Module. ... Python 中的正規表示式是一組字元或序列,用於使用正式語法將字串與另一個模式匹配。你可以將...
- 2[Python] 正規表示法Regular Expression - 子風的知識庫
- 3Python正規表示式:不一定要會,但會了超省力
- 4[Day12] 字串和正規表示式 - iT 邦幫忙
幾乎所有的程式語言都提供了對正則表達式操作的支持,Python 透過re 模組支持正規表示式操作。 正規表示式中的一些基本符號進行的扼要總結。如果需要匹配的字符是正則 ...
- 5如何使用正規表達式— Python 3.10.5 說明文件