昨天做網頁爬取的時候,感覺自己對正則不熟悉的很,故今天再花上午時間認真整理下,不可懈怠。
1.常見正規表示式符號
[1].literal 匹配文字字串的字面值literal
[2].re1|re2 匹配正規表示式re1或者re2 foo | bar
[3].. 匹配任何字元(除\n) b.b
[4].^ 匹配字串的起始部分 ^dear
[5].$ 匹配字串的終止部分 /bin/*sh$
[6].* 匹配0次或多次前面出現的正規表示式 [a-za-z0-9]*
[7].+ 匹配1次或者多次前面出現的正規表示式 [a-z]+\.com
[8].? 匹配0次或1次前面出現的正規表示式 goo?
[9]. 匹配n次前面出現的正規表示式 [0-9]
[10]. 匹配m~n次前面出現的正規表示式 [0-9]
[11].[...] 匹配來自字符集的多個字元 [aeiou]
[12].[..x-y..] 匹配x-y範圍內的任意單一字元 [0-9a-za-z]
[13].[^...] 不匹配此字符集中出現的任何乙個字元,包括某一範圍內的字元 [^fsdlkj] [^a-z]
[14].(*|+|?|{})? 用於匹配上面頻繁出現的符號的非貪婪版本 .*?[a-z]
[15].(...) 匹配封閉的正規表示式,然後另存為子組 ([0-9])?, f(oo|u)bar
2.特殊字元
[1].\d 匹配任何十進位制數字,與[0-9]一致(\d表示不匹配任何非數值型的數字) data\d+.txt
[2].\w 匹配任何字母數字字元,與[0-9a-za-z]相同(\w與之相反) [a-za-z]\w+
[3].\s 匹配任何空格字元(\s與之相反) of\sthe
[4].\b 匹配任何單詞邊界(\b與之相反) \bthe\b
[5].\number 匹配已儲存的子組number price:\16
[6].\c 僅按字面意思匹配,不匹配特殊含義 \., \\, \*
[7].\a(\z) 匹配字串的開始(結束) \adear
3.使用圓括號指定分組
有些時候,我們不僅對之前匹配成功的資料更感興趣,而且想要知道能否提取任何已經匹配成功的特定字串或者子字串。為了解決這個問題,只要用一對圓括號包裹任何正規表示式。
當使用圓括號時,一對圓括號可以實現以下任意乙個功能:1)對正規表示式進行分組;2)匹配分組。
\d+(\.\d*)? 表示簡單浮點數的字串,也就是說,任何十進位制數字,後面可以接乙個小數點和零個或者多個十進位制數字,例如"0.004","2","75."
(mr?s?)?[a-z][a-z]*[a-za-z-]+ 名字和姓氏,以及對名字的限制(如果有,首字母必須大寫,後續字母小寫),全名前可以有可選的"mr.","mrs.","ms."或者"m."作為稱謂,以及可選的姓氏,可以有多個單詞、橫線以及大寫字母。
4.re模組核心函式和方法
[1].僅僅是re模組函式
compile(pattern, flags=0) 使用任何可選的標記來編譯正規表示式的模式,然後返回乙個正規表示式物件
[2].re模組和正規表示式物件的方法
match(pattern, string, flags=0) 嘗試使用帶有可選的標記的正規表示式的模式來匹配字串。如果匹配成功,就返回匹配物件,如果失敗,就返回none。
search(pattern, string, flags=0) 使用可選標記搜尋字串中第一次出現的正規表示式的模式來搜尋字串,如果搜尋成功,則返回匹配的字串;否則返回none
findall(pattern, string[,flags]) 查詢字串中所有(非重複)出現的正規表示式模式,findall方法總是返回乙個列表,如果匹配成功,列表將包含所有成功匹配的部分(從左向右順序排列),如果失敗則返回乙個空列表。
子組在乙個更複雜的返回列表中搜尋結果,而且這樣做是有意義的,因為子組是允許從單個正規表示式中抽取特定模式的一種機制。
example:
# 使用findall和finditer查詢每一次出現的位置
s = 'this and that and this and that'
lists = re.findall(r'(th\w+) and (th\w+)', s, re.i)
print(lists)
result:
[('this', 'that'), ('this', 'that')]
finditer(pattern, string[, flags]) 與findall函式相同,但返回的不是乙個列表,而是乙個迭代器。它的優點在於更節省記憶體資源。
iters = pattern.finditer('dottt0999-ewar3223--aanot333423-fsd-0')
for iter in iters:
print(iter.group())
split(pattern, string, max=0)
sub(pattern, repl, string, count=0) 使用repl替換所有正規表示式的模式在字串中出現的位置,除非定義count,否則將替換所有出現的位置
[3].常見的匹配物件方法
group(num=0) 返回整個匹配物件,或者編號為num的子組
groups(default=none) 返回乙個包含所有匹配子組的元組(如果沒有成功匹配,則返回乙個空元祖)
groupdict(default=none) 返回乙個包含所有匹配的命名子組的字典,所有的子組名稱作為字典的鍵(如果沒有成功匹配,就返回乙個空字典)
groupdict看似很難,但通過例子可以相當便利的理解:
example:
match = re.search(r'\((?p\d)\) (?p\d)-(?:\d)',
'(800) 555-1212')
print( match.groupdict() )
result:
意思是,如果給分組起了別名,那麼在groupdict中就會顯示以別名為鍵,正則模式匹配字元為值的字典。
[4].常用的屬性模組
re.i 不區分大小寫的匹配
re.l 根據所使用的本地語言環境通過\w,\w,\b,\b,\s,\s實現匹配
re.m ^和$分別匹配目標字串中的行的起始和結尾,而不是嚴格匹配整個字串本身的起始和結尾。
re.s '.'號通常匹配除了\n之外的所有單個字元;該標記表示'.'號能夠匹配全部字元
5.常見用法:
[1].匹配多個字串
bt = 'bat|bet|bit'
m = re.match(bt, 'bat')
if m is not none:
print(m.group())
[2].特殊含義的字元匹配
., *, ?, (, ), +, ... 這些字元都需要轉義後才能匹配字串中原有字元。
比如字串為***@yyy.com,那麼需要使用(\w+)@(\w+)\.com才能匹配,注意其中的.的轉義。
[3].從單個正規表示式中抽取特定模式(使用分組)
例如我們想要匹配乙個完整**號碼中的一部分,例如區號; 或者完整電子郵件位址的一部分,例如登入名稱。
example:
s = 'this and that'
print( re.findall(r'(th\w+) and (th\w+)', s, re.i) )
result:
[('this', 'that')]
[4].將美式的日期表示法mm/dd/yy格式轉換為其他國家常用的格式dd/mm/yy
可以使用\n取出匹配分組,其中n是在替換字串中使用的分組編號。
很奇怪:
s = "i love you so dont let me upset"
lists = re.findall(r'(?#this is wonderful)(?p\b.*?o.*?\b)', s, re.s)
的結果為什麼是:['i love', ' you', ' so', ' dont']呢?為什麼是'i love'?
c語言再學習之巨集與函式
巨集概念 c 巨集定義將乙個 識別符號定義為乙個字串,源程式 中的該識別符號均以指定的字串來代替。巨集書寫形式 define 巨集名 參數列 巨集體 巨集與函式的區別 時間上考慮 1 巨集只佔編譯時間,函式呼叫則占用執行時間 分配單元,儲存現場,值傳遞,返回 每次執行都要載入,所以執行相對巨集會較慢...
spring再學習之註解
1 使用註解配置spring xml version 1.0 encoding utf 8 beans xmlns xsi xmlns xmlns p xmlns context xmlns tx xsi schemalocation spring beans 4.2.xsd spring cont...
Python學習之正則
python學習目錄 在mac下使用python3 python學習之資料型別 python學習之函式 python學習之高階特性 python學習之函式式程式設計 python學習之模組 python學習之物件導向程式設計 python學習之物件導向高階程式設計 python學習之錯誤除錯和測試 ...