正則表法式(regular expression):使用正確的規則表示或者描述字串資料。正規表示式目的是針對字串資料的查詢匹配和檢索替換。
正規表示式本身是一種 小型的,高度專業化 的程式語言,而在 python 中,通過內嵌整合 re模組,我們可以直接呼叫來實現正則匹配。正規表示式模式被編譯成一系列的位元組碼,然後由用 c編寫的匹配引擎來執行!
通過正規表示式,可以:
正規表示式的 「祖先」 可以一直上溯至對人類神經系統如何工作的早期研究。warren mcculloch 和 walter pitts 這兩位神經生理學家研究出一種數學方式來描述這些神經網路。
1956 年, 一位叫 stephen kleene 的數學家在 mcculloch 和 pitts 早期工作的基礎上,發表了一篇標題為 「神經網事件的表示法」 的**,引入了正規表示式的概念。正規表示式就是用來描述他稱為 「正則集的代數」 的表示式,因此採用"正規表示式"這個術語。
隨後,發現可以將這一工作應用於使用 ken thompson 的計算搜尋演算法的一些早期研究,ken thompson 是 unix 的主要發明人。正規表示式的第乙個實用應用程式就是 unix 中的 qed 編輯器。
如他們所說,剩下的就是眾所周知的歷史了。從那時起直至現在正規表示式都是基於文字的編輯器和搜尋工具中的乙個重要部分。
普通字元和元字元 字元
描述.匹配任意除換行符"\n"外的字元(在dotall模式中也能匹配換行符)
\轉義字元,使後乙個字元改變原來的意思
*匹配前乙個字元0次或多次
+匹配前乙個字元1次或多次
?匹配前乙個字元0次或1次
^匹配字串開頭
$匹配字串結尾
|指明兩項之間乙個選擇
匹配前乙個字元m次
匹配前乙個字元m至n次
匹配前乙個字元至少出現m次以上
字符集。對應的位置可以是字符集中任意字元,字符集中的字元可以逐個列出,也可以給出範圍,如[abc]或[a-c]。[^a-c]表示取反,即非abc
()被括起來的表示式將作為分組
這裡強調一下反斜槓 \ 的作用:
strs =
"howdoyoudo"
# 此處 \2 代表引用 (do)
re.search(r"(how)(do)(you)\2"
,strs)
.group(
)# howdoyoudo
預定義字符集 字元
描述\d
數字:[0-9]
\d非數字:[^0-9]
\s匹配任何空白字元:[《空格》\t\r\n\f\v]
\s匹配非空白字元:[^\s]
\w匹配包括下劃線在內的任意字母及數字:[a-za-z0-9_]
\w匹配非字母字元
\a匹配字串開頭,同^
\z匹配字串結尾,同$
\b匹配單詞的邊界
\b[^\b]
正規表示式預設是貪婪匹配,也就是匹配盡可能多的字元,加個?
就可以採用非貪婪模式(懶惰模式)
# 貪婪模式
re.search(r"\d+"
,"10010"
).group(
)# 由於是貪婪模式,直接把所有的資料全部匹配了
# 10010
# 非貪婪模式(懶惰模式)
re.search(r"\d+?"
,"10010"
).group(
)# 1
編譯正規表示式模式,返回乙個物件的模式。(可以把那些常用的正規表示式程式設計成正規表示式物件,提高一點效率)
re.compile(pattern,flags=0)
pattern: 編譯時用的表示式字串
flags: 編譯標誌位,用於修改正規表示式的匹配方式
flags標誌
描述re.s
使 . 匹配保羅換行在內的所有字元
re.i
使匹配對大小寫不敏感
re.l
做本地化識別(locale-aware)匹配,法語等
re.m
多行匹配,影響^和$
re.x
這個選項忽略規則表示式中的空白和注釋,並允許使用#
來引導乙個注釋。這樣可以讓你把規則寫得更美觀些
re.u
根據 unicode字符集解析字元,這個標誌影響\w,\w,\b,\b
從字串起始位置開始匹配
re.match(pattern, string, flags=0)
匹配成功返回乙個match object物件,否則返回 none
掃瞄整個字串並返回第乙個成功的匹配
re.search(pattern, string, flags=0)
匹配成功返回乙個match object物件,否則返回 none
match object物件有如下方法:在字串中找到正規表示式所匹配的所有子串
re.findall(pattern, string, flags=0)
返回包含所有匹配結果的列表,如果沒有找到匹配的,返回空列表
在字串中找到正規表示式所匹配的所有子串,並把它們作為乙個迭代器返回
re.finditer(pattern, string, flags=0)
按照能夠匹配的子串將字串分割後返回列表
re.split(pattern, string[, maxsplit=0, flags=0])
maxsplit用於指定最大分割次數,不指定將全部分割
import re
strs =
"can you speak chinese?"
print
(re.split(r" "
,strs)
)# ['can', 'you', 'speak', 'chinese?']
使用 re 替換 string 中每乙個匹配的子串後返回替換後的字串
re.sub(pattern, repl, string, count=0, flags=0)
import re
strs =
"can you speak chinese?"
print
(re.sub(r" "
,"-"
,strs)
)# can-you-speak-chinese?
re.sub 還允許使用匿名函式對匹配項的替換進行複雜的處理
import re
strs =
"can you speak chinese?"
print
(re.sub(r" "
,lambda m:
"+m.group(0)
+">"
,strs)
)# can< >you< >speak< >chinese?
返回替換次數
subn(pattern, repl, string, count=0, flags=0)
import re
strs =
"can you speak chinese?"
print
(re.subn(r" "
,"-"
,strs)
)# ('can-you-speak-chinese?', 3)
python中的正規表示式
正規表示式是一種用來匹配字串的強有力的 它的設計思想是用一種描述性的語言來給字串定義乙個規則,凡是符合規則的字串,我們就認為它 匹配 了,否則,該字串就是不合法的。因為正規表示式也是用字串表示的,所以,我們要首先了解如何用字元來描述字元。在正規表示式中,如果直接給出字元,就是精確匹配。用 d可以匹配...
Python中的正規表示式
在使用python製作爬蟲之前,我們必須要對python的正規表示式有一定的了解,在python中使用正規表示式要匯入re包 d匹配數字1 9 w匹配字元 匹配集合裡面的字元 匹配前面出現的正規表示式1次或多次 表示匹配任意乙個字元,除換行符除外,x.匹配xy23中的xy,若是x.則匹配出xy2 表...
Python中的正規表示式
對應 abc 001 s r abc 001 加r字首,就不用考慮轉義的問題了。print re.match d d 010 12345 匹配成功返回乙個match物件,否則返回none.re.match 的常見寫法 test 輸入字串 if re.match 正規表示式 test print ok...