正則表達式在平時做文本處理(爬蟲程序去解析html中的字段,在分析log文件的時候需要抓取一些關鍵數據)的時候經常會用到。一般我們會使用到Python的re庫。如果正則表達式自己代碼中反復被用到的時候,我們可以將這個正則表達式使用re.compile函數轉換成一個object方便調用。
match
將輸入的字符串從第一個字符開始匹配,如果不匹配將會直接返回空。
search
和match不同,search能自由的在字符串中任一開始位置開始匹配,直到匹配上了。
re中的選項
通常在flag里面可以設置.
re.I 忽略掉大小寫
re.L 讓\w,\W,\b,\B,\s和\S做本地化識別
re.M 當匹配的時候支持多行匹配.
re.DEBUG 顯示正則表達式的調試信息
re.S 讓.號匹配本行的全部字符。
sub 替換
import re phone='188-88-88 # this is my phone number' num = re.sub(r'#.*$','',phone) # num ==188-88-88 num = re.sub(r'\D','',phone) # num = 1888888
還能使用這個來做代碼的轉義,有點像在 sublime text里面使用的查找替換。比如說我需要將C語言里面的宏定義轉換成lua里面的變量定義
import re print( re.sub( r'#define\s+([a-zA-Z_]+)\s+([a-zA-Z_0-9]+)', r'_G.\1 = \2', '#define MAX_RECV_SIZE 100' ) ) #_G.MAX_RECV_SIZE = 100
subn函數類似,只是能定制替換的次數。
findall
將匹配到的內容返回成一個數組,這個應該是比較常用的方法。
print( re.findall( '\d+', '66,88,88,777' ) ) # ['66', '88', '88', '777']
finditer
匹配的內容以迭代器的方式返回,我們可以對這個做循環(huán),返回的時候MatchObject
for num in re.finditer( '\d+', '66,88,88,777' ): print num.group() ''' 66 88 88 777 '''
split
re.split(pattern, string, maxsplit=0, flags=0) >>> re.split(',', 'Words, words, words.') ['Words', ' words', ' words.'] >>> re.split('\W+', 'Words, words, words.') ['Words', 'words', 'words', ''] >>> re.split('(\W+)', 'Words, words, words.') ['Words', ', ', 'words', ', ', 'words', '.', '']
大寫的\W表示了非字串,這個在語法里面可以查到。如果加了括號,將不會省略掉匹配到的split的字串。最后這個在數組中作為字串分隔符的,.都被保留在數組中了。
escape
這個函數是一個輔助函數,當大量編寫正則表達式的時候,可能我們固定的一些字串中包含了正則的保留字串,但是我們不需要讓程序當它是re表達式的時候,可以使用這個函數將字串做轉換。
re.escape('1234@gmail.com') # result 1234\\@gmai\\.com
備注語法:
模式 描述