今天學習測試了一下Python中的正則表達式的模塊用法。初學 Python ,對 Python 的文字處理能力有很深的印象,除了 str 對象自帶的一些方法外,就是正則表達式這個強大的模塊了。可是對於初學者來講,要用好這個功能仍是有點難度,因爲我記性很差,很容易就忘事,因此仍是寫下來比較好一些,同時也能夠加深印象,整理思路。
因爲我是初學,因此確定會有些錯誤,還望高手不吝賜教,指出個人錯誤。python
1、Python中轉義字符
正則表達式使用反斜槓" \ "來表明特殊形式或用做轉義字符,這裏跟Python的語法衝突,所以,Python用" \\\\ "表示正則表達式中的" \ ",由於正則表達式中若是要匹配" \ ",須要用\來轉義,變成" \\ ",而Python語法中又須要對字符串中每個\進行轉義,因此就變成了" \\\\ "。
上面的寫法是否是以爲很麻煩,爲了使正則表達式具備更好的可讀性,Python特別設計了原始字符串(raw string),須要提醒你的是,在寫文件路徑的時候就不要使用raw string了,這裏存在陷阱。raw string就是用'r'做爲字符串的前綴,如 r"\n":表示兩個字符"\"和"n",而不是換行符了。Python中寫正則表達式時推薦使用這種形式。正則表達式
2、正則表達式元字符說明:ide
. 匹配除換行符之外的任意字符 ^ 匹配字符串的開始 $ 匹配字符串的結束 [] 用來匹配一個指定的字符類別 ? 對於前一個字符字符重複0次到1次 * 對於前一個字符重複0次到無窮次 {} 對於前一個字符重複m次 {m,n} 對前一個字符重複爲m到n次 \d 匹配數字,至關於[0-9] \D 匹配任何非數字字符,至關於[^0-9] \s 匹配任意的空白符,至關於[ fv] \S 匹配任何非空白字符,至關於[^ fv] \w 匹配任何字母數字字符,至關於[a-zA-Z0-9_] \W 匹配任何非字母數字字符,至關於[^a-zA-Z0-9_] \b 匹配單詞的開始或結束
3、導入正則表達式模塊
3.一、導入正則表達式模塊函數
>>> import re
3.二、查看正則表達式模塊方法學習
>>> dir(re) ['DEBUG', 'DOTALL', 'I', 'IGNORECASE', 'L', 'LOCALE', 'M', 'MULTILINE', 'S', 'Scanner', 'T', 'TEMPLATE', 'U', 'UNICODE', 'VERBOSE', 'X', '_MAXCACHE', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__version__', '_alphanum', '_cache', '_cache_repl', '_compile', '_compile_repl', '_expand', '_pattern_type', '_pickle', '_subx', 'compile', 'copy_reg', 'error', 'escape', 'findall', 'finditer', 'match', 'purge', 'search', 'split', 'sre_compile', 'sre_parse', 'sub', 'subn', 'sys', 'template'] >>>
4、經常使用的正則表達式處理函數
4.一、re.search
re.search 函數會在字符串內查找模式匹配,只到找到第一個匹配而後返回,若是字符串沒有匹配,則返回None。
提示:當咱們不會用模塊方法的時候用help測試
>>> help(re.search) search(pattern, string, flags=0)
第一個參數:規則
第二個參數:表示要匹配的字符串
第三個參數:標緻位,用於控制正則表達式的匹配方式
實例:下面的例子kuangl ui
>>> name="Hello,My name is kuangl,nice to meet you..." >>> k=re.search(r'k(uan)gl',name) >>> if k: ... print k.group(0),k.group(1) ... else: ... print "Sorry,not search!" ... kuangl uan
4.二、re.match
re.match 嘗試從字符串的開始匹配一個模式,也等於說是匹配第一個單詞url
>>> help(re.match) match(pattern, string, flags=0)
第一個參數:規則
第二個參數:表示要匹配的字符串
第三個參數:標緻位,用於控制正則表達式的匹配方式
實例:下面的例子匹配Hello單詞spa
>>> name="Hello,My name is kuangl,nice to meet you..." >>> k=re.match(r"(\H....)",name) >>> if k: ... print k.group(0),'\n',k.group(1) ... else: ... print "Sorry,not match!" ... Hello Hello >>>
re.match與re.search的區別:re.match只匹配字符串的開始,若是字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。設計
4.三、re.findall
re.findall 在目標字符串查找符合規則的字符串
>>> help(re.findall) findall(pattern, string, flags=0)
第一個參數:規則
第二個參數:目標字符串
但三個參數:後面還能夠跟一個規則選擇項
返回的結果是一個列表,建中存放的是符合規則的字符串,若是沒有符合規則的字符串唄找到,就會返回一個空值。
實例:查找郵件帳號
>>> mail='<user01@mail.com> <user02@mail.com> user04@mail.com' #第3個故意沒有尖括號 >>> re.findall(r'(\w+@m....[a-z]{3})',mail) ['user01@mail.com', 'user02@mail.com', 'user04@mail.com']
4.四、re.sub
re.sub 用於替換字符串的匹配項
>>> help(re.sub) sub(pattern, repl, string, count=0)
第一個參數:規則
第二個參數:替換後的字符串
第三個參數:字符串
第四個參數:替換個數。默認爲0,表示每一個匹配項都替換
實例:將空白處替換成-
>>> test="Hi, nice to meet you where are you from?" >>> re.sub(r'\s','-',test) 'Hi,-nice-to-meet-you-where-are-you-from?' >>> re.sub(r'\s','-',test,5) #替換至第5個 'Hi,-nice-to-meet-you-where are you from?' >>>
4.五、re.split
re.split 用於來分割字符串
>>> help(re.split) split(pattern, string, maxsplit=0)
第一個參數:規則
第二個參數:字符串
第三個參數:最大分割字符串,默認爲0,表示每一個匹配項都分割
實例:分割全部的字符串
>>> test="Hi, nice to meet you where are you from?" >>> re.split(r"\s+",test) ['Hi,', 'nice', 'to', 'meet', 'you', 'where', 'are', 'you', 'from?'] >>> re.split(r"\s+",test,3) #分割前三個 ['Hi,', 'nice', 'to', 'meet you where are you from?'] >>>
4.六、re.compile
re.compile 能夠把正則表達式編譯成一個正則對象
>>> help(re.compile) compile(pattern, flags=0)
第一個參數:規則
第二個參數:標誌位
實例:
>>> test="Hi, nice to meet you where are you from?" >>> k=re.compile(r'\w*o\w*') #匹配帶o的字符串 >>> dir(k) ['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn'] >>> print k.findall(test) #顯示全部包涵o的字符串 ['to', 'you', 'you', 'from'] >>> print k.sub(lambda m: '[' + m.group(0) + ']',test) # 將字符串中含有o的單詞用[]括起來 Hi, nice [to] meet [you] where are [you] [from]? >>>
5、用urllib二、re、os 模塊下載文件的腳本
#!/usr/bin/env python import urllib2 import re import os URL='http://p_w_picpath.baidu.com/channel/wallpaper' read=urllib2.urlopen(URL).read() pat = re.compile(r'src="http://.+?.js">') urls=re.findall(pat,read) for i in urls: url= i.replace('src="','').replace('">','') try: iread=urllib2.urlopen(url).read() name=os.path.basename(url) with open(name,'wb') as jsname: jsname.write(iread) except: print url,"url error"