Python re模塊詳解


今天學習測試了一下Python中的正則表達式的模塊用法。初學 Python ,對 Python 的文字處理能力有很深的印象,除了 str 對象自帶的一些方法外,就是正則表達式這個強大的模塊了。但是對於初學者來說,要用好這個功能還是有點難度,由於我記性不好,很容易就忘事,所以還是寫下來比較好一些,同時也可以加深印象,整理思路。
由於我是初學,所以肯定會有些錯誤,還望高手不吝賜教,指出我的錯誤。

一、Python中轉義字符
     正則表達式使用反斜杠" \ "來代表特殊形式或用作轉義字符,這里跟Python的語法沖突,因此,Python用"\\\\ "表示正則表達式中的" \ ",因為正則表達式中如果要匹配" \ ",需要用\來轉義,變成" \\ ",而Python語法中又需要對字符串中每一個\進行轉義,所以就變成了" \\\\ "。
上面的寫法是不是覺得很麻煩,為了使正則表達式具有更好的可讀性,Python特別設計了原始字符串(raw string),需要提醒你的是,在寫文件路徑的時候就不要使用raw string了,這里存在陷阱。raw string就是用'r'作為字符串的前綴,如 r"\n":表示兩個字符"\"和"n",而不是換行符了。Python中寫正則表達式時推薦使用這種形式。

二、正則表達式元字符說明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.    匹配除換行符以外的任意字符
^    匹配字符串的開始
$    匹配字符串的結束
[]   用來匹配一個指定的字符類別
?   對於前一個字符字符重復 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.1、導入正則表達式模塊

1
>>>  import re

3.2、查看正則表達式模塊方法

1
2
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.1、re.search
    re.search 函數會在字符串內查找模式匹配,只到找到第一個匹配然后返回,如果字符串沒有匹配,則返回None。
   提示:當我們不會用模塊方法的時候用help

1
2
>>>  help (re.search)
search(pattern, string, flags = 0 )

   第一個參數:規則
   第二個參數:表示要匹配的字符串
   第三個參數:標致位,用於控制正則表達式的匹配方式
   實例:下面的例子kuangl

1
2
3
4
5
6
7
8
>>> 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.2、re.match
   re.match 嘗試從字符串的開始匹配一個模式,也等於說是匹配第一個單詞

1
2
>>>  help (re.match)
match(pattern, string, flags = 0 )

   第一個參數:規則
   第二個參數:表示要匹配的字符串
   第三個參數:標致位,用於控制正則表達式的匹配方式
   實例:下面的例子匹配Hello單詞

1
2
3
4
5
6
7
8
9
10
>>> 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.3、re.findall
   re.findall 在目標字符串查找符合規則的字符串

1
2
>>>  help (re.findall)
findall(pattern, string, flags = 0 )

  第一個參數:規則
  第二個參數:目標字符串
  但三個參數:后面還可以跟一個規則選擇項
  返回的結果是一個列表,建中存放的是符合規則的字符串,如果沒有符合規則的字符串唄找到,就會返回一個空值。
  實例:查找郵件賬號

1
2
3
>>> 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.4、re.sub
  re.sub 用於替換字符串的匹配項

1
2
>>>  help (re.sub)
sub(pattern, repl, string, count = 0 )

  第一個參數:規則
  第二個參數:替換后的字符串
  第三個參數:字符串
  第四個參數:替換個數。默認為0,表示每個匹配項都替換
  實例:將空白處替換成-

1
2
3
4
5
6
>>> 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.5、re.split
  re.split 用於來分割字符串

1
2
>>>  help (re.split)
split(pattern, string, maxsplit = 0 )

  第一個參數:規則
  第二個參數:字符串
  第三個參數:最大分割字符串,默認為0,表示每個匹配項都分割
  實例:分割所有的字符串

1
2
3
4
5
6
>>> 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.6、re.compile
  re.compile 可以把正則表達式編譯成一個正則對象

1
2
>>> help(re.compile)
compile(pattern, flags= 0 )

  第一個參數:規則
  第二個參數:標志位 
  實例:

1
2
3
4
5
6
7
8
9
>>> 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 ]?
>>>

五、用urllib2、re、os 模塊下載文件的腳本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/env python
import urllib2
import re
import os
URL = 'http://image.baidu.com/channel/wallpaper'
read = urllib2.urlopen(URL).read()
pat  = re. compile (r 'src=\'#\'" //.+?.js">' )
urls = re.findall(pat,read)
for in urls:
url = i.replace( 'src=\'#\'" /code>,'').replace('">','')
try:
iread=urllib2.urlopen(url).read()
name=os.path.basename(url)
with open(name,'wb') as jsname:
jsname.write(iread)
except:
printurl,"url error"

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com