1. 核心筆記:查詢與匹配的比較
當我們完全討論與字串中模式有關的正規表示式時,我們會用術語"matching"(匹配),指的是術語pattern-matching(模式匹配)。在python專門術語中,有兩種主要方法完成模式匹配:搜尋(searching)和匹配(matching)。搜尋,即在字串任意部分中查詢匹配的模式;而匹配是指,判斷乙個字串能否從起始處全部或部分的匹配某個模式。搜尋通過search()函式或方法來實現,而匹配是以呼叫match()函式或方法來實現的。
2. 正規表示式使用的特殊符號和字元
記號說明
舉例literra1
匹配字串的值
foore1 | re2
匹配正規表示式re1或re2
foo|bar
.(點號)
匹配任何字元(換行符除外)
b.b^
匹配字串的開始
^dear
$匹配字串的結尾
/bin/*sh$
*匹配前面出現的正規表示式零次 或 多次
[a-za-z0-9]*
+匹配前面出現的正規表示式一次 或 多次
[a-z]+\.com
?匹配前面出現的正規表示式零次 或 一次
goo?
匹配前面出現的正規表示式n次
[0-9]
匹配重複出現m次 到 n次的正規表示式
[0-9]
[...]
匹配字元陣列裡出現的任意乙個字元
[aeiou]
[..x-y..]
匹配從字元x到y中的任意乙個字元
[0-9],[a-za-z]
[^...]
不匹配此字符集中出現的任何乙個字元
[^aeiou],[^a-za-z0-9]
(...)
匹配封閉括號中正規表示式(re),儲存為子組
[0-9]
特殊符號
\d
匹配任何數字,和[0-9]一樣(\d是\d的反義:任何非數字符)
data\d+.txt
\w匹配任何數字字母字元,和[a-za-z0-9]相同(\w是其反義)
[a-za-z]\w+
\s匹配任何空白符,和[\n\t\r\v\f]相同,(\s是其反義)
of\sthe
\b匹配單詞邊界(\b是其反義)
\bthe\b
\nn匹配已儲存的子組
price: \16
\c逐一匹配特殊字元c(即取消它的特殊含義,按字面匹配)
\. , \\, \*
\a(\z)
匹配字串的起始(結束)
\adear
3. (1) 用管道符號( | )匹配多個正規表示式模式
管道符號( | ), 選擇被管道符號分隔的多個不同的正規表示式中的乙個。例如,下面的一些使用或操作的模式,和它們所匹配的字串:
正規表示式模式
匹配的字串
at | home
at , home
bat | bet | bit
bat , bet , bit
(2) 匹配任意乙個單個的字元( . )
點字元或句號(.)符號匹配除換行符(newline)外的任意乙個單個字元(python 的正規表示式有乙個編譯標識 [s or dotall],該標識能 去掉 這一限制,使 ( . ) 在匹配時包括換行符(newlines)。)(這裡括號缺一半) 無論是字母、數字、不包括「\n」的空白符、可列印的字元、還是非列印字元,或是乙個符號,「點」,( . )都可以匹配他們。
正表示式模式
匹配的字串
f.o
在"f"和"o"中間的任何字元,如fao, f9o, f#o 等
..任意兩個字元
.end
匹配在字串end 前面的任意乙個字元
4. python原始字串(raw strings)的用法:
原始字串的產生正是由於有正規表示式的存在。原因是ascii字元和正規表示式特殊字元間所產生的衝突。比如,特殊字元"\b"在ascii字元中代表退格鍵,但同時"\b"也是正規表示式的特殊符號,代表"匹配乙個單詞邊界"。為了讓re編譯器把兩個字元"\b"當成你想要表達的字串,而不是乙個退格鍵,你需要用另乙個反斜線對它進行轉義,即可以這樣寫"\\b"。
但是這樣做會把問題複雜化,特別是當你的正規表示式字串裡有很多特殊字元時,就更容易令人困惑了。我們可以使用原始字串,它可以用來簡化正規表示式的複雜程式。事實上,很多python程式設計師在定義正規表示式時都只使用原始字串。
下面的例子用來說明退格鍵"\b"和正規表示式"\b"(包含或不包含原始字串)之間的區別:
>>> m=re.match("\bblow","blow") #表達是退格,沒有匹配
>>> if m is not none:m.group()
...
>>> m=re.match("\\bblow","blow") #轉義後就可以匹配
>>> if m is not none:m.group()
...
'blow'
>>> m=re.match(r"\bblow","blow") #用原始字元也可以匹配
>>> if m is not none:m.group()
...
'blow'
>>>
5. 用findall找到每個出現的匹配部分
findall用於非重疊地查詢某字串中乙個正規表示式模式出現的情況。findall()與search()相似之處在於二者都執行字串搜尋,但是與search和match不同之處是findall()總返回乙個列表。如果findall()沒有找到匹配的部分,會返回空列表;如果成功找到匹配部分,則會返回所有匹配部分的列表(按從左到右出現的順序排列)
>>> re.findall('car','car')
['car']
>>> re.findall('car','scary')
['car']
>>> re.findall('car','carry the barcardi to the car')
['car', 'car', 'car']
包含字組的搜尋會返回更複雜的乙個列表,這樣做是有意義的,因為子組是允許你從單個正規表示式抽取特定模式的一種機制,比如,匹配乙個完整**號碼中的一部分(例如區號),或完整電子郵件位址的一部分(例如登入名)
正規表示式僅有乙個子組時,findall()返回子組匹配的字串組成列表;如果表示式有多個子組,返回的結果是乙個元組的列表,元組中的每個元素都是乙個子組的匹配內容,像這樣的元組(每乙個成功的匹配對應乙個元組)構成了返回列表中的元素。
import re,urllib
htmlsource = urllib.urlopen("").read(20000)
linkslist=re.findall('(.*?)',htmlsource)
#print linkslist
for link in linkslist:
print link[0]
6. python正規表示式的除錯方法:
import re
numbers=["123 555 6789","1-(123)-555-6789","123-456-6789","(123).555.6789"]
for number in numbers:
pattern=re.match(r"\d \d \d",number,re.debug) #加上re.debug就是開啟的除錯模式
if pattern:
print pattern
print pattern.group()
下面是輸出的結果:
beyond@beyond ~/code/code-python $ python debug.py
max_repeat 3 3
incategory category_digit
literal 32
max_repeat 3 3
incategory category_digit
literal 32
max_repeat 4 4
incategory category_digit
<_sre.sre_match object at 0x7f1647b30440>
123 555 6789
python pandas 正規表示式 re模組
目錄 1 正則解說 數量詞的貪婪模式與非貪婪模式 正規表示式通常用於在文字中查詢匹配的字串。python裡數量詞預設是貪婪的 在少數語言裡也可能是預設非貪婪 總是嘗試匹配盡可能多的字元 非貪婪的則相反,總是嘗試匹配盡可能少的字元。例如 正規表示式 ab 如果用於查詢 abbbc 將找到 abbb 而...
python 正規表示式 re
match 和 search 的區別 match是從字串開頭匹配,而search是在整個字串中匹配。如 p re.compile a z p.match message none 因為開頭是 因此無法匹配 而 m p.search message print m re.matchobject ins...
python正規表示式 re
re.match 嘗試從字串的開始匹配乙個模式,如 下面的例子匹配第乙個單詞。import retext jgood is a handsome boy,he is cool,clever,and so on.m re.match r w s text ifm print m.group 0 n m...