1. 程式人生 > >學習正則表達式在python中的應用

學習正則表達式在python中的應用

python 正則 表達式

目的:對文本的處理,正則表達式的功能很強大,可以很巧妙的過濾、匹配、獲取想要的字符串,是必須學習的技能,這裏只記錄常用的寫法,詳細文檔可以參看官方幫助文檔。


環境:ubuntu 16.04 python 3.5


在python中使用正則表達式首先要導入re模塊

import re

在re模塊中有幾個常用的函數:


re.compile(‘value‘)

它會返回一個正則表達式regex對象,作用是對預編譯提速,且第二個參數支持一些方法,把它返回給一個變量方便重復使用,函數有兩個參數:匹配表達式和第二個可選參數:

匹配表達式即,正則表達式的寫法,因為表達式中常用\符號,所以一般第一個參數下載r‘‘內,r表示引號內為自然字符,python不對內部做轉義,這樣正則表達式用轉義時不用多加一個\,如:r‘\d‘,\d在正則中是匹配一個數字,如果沒有r則要寫成‘\\d‘,這樣很麻煩且不易閱讀。

最簡單的匹配:r‘haha‘匹配字符‘haha‘,但不匹配‘hehe‘,可以使用通配符,下面介紹:

常用通配符:

\d表示一個數字

\w表示字母、數字、下劃線中任意一個,且在python3中支持匹配一個漢字。

\s表示空格、制表符和換行中任意一個。

\D, \W, \S是他們的非模式。

^匹配字符串起始位置,當^在方括號內是表示非模式,[^a-z]小寫26個字母以外。

$匹配字符串結尾位置。

\b表示一個字符旁空格的位置,‘it is a good job‘, \bgoog\b匹配good,而不會匹配goods等其他。

| 豎杠表示或,如\d|\d{2},匹配一個數字或兩個數字。

自定義通配符:

[a-z]表示小寫a到z的26個字母中任意一個

[]中括號模式可以包含很多,比如:[a-zA-Z0-9_]這個就是\w(只在python2中相等),還可以想這樣[aeiou]只包含想要匹配的,或者特殊符號[._-],需要轉義的要加上\。


以上都是只匹配符合的一個,下面學習數量:

匹配最少:{5} 表示5次,{1,5}表示1次到5次都可以,{1,}省略後面的表示至少1次。

貪婪匹配:+等同於{1,},*表示可無或更多,?表示一次或更多,.點表示就是\S,這裏都會匹配多的結果,因為是貪婪模式。

限制貪婪:在貪婪模式後面加上?表示限制貪婪,匹配最少,+會盡量匹配多的,+?匹配一個。


numRegex = re.compile(r‘\d{11}‘)
# 生成匹配11位數字的正則對象,\d是數字,{11}代表11次

re.compile()的第二個參數有:re.VERBOSE, re.IGNORECASE和re.DOTALL,後面要大寫。

re.VERBOSE表示匹配中可以多行且有註釋,在復雜的正則對象中使用。

re.compile(r‘‘‘(
    \d        #匹配一個數字
    \w        #匹配一個字符
)‘‘‘, re.VERBOSE)

re.IGORECASE表示匹配不區分大小寫:

re.compile(r‘[a-z]‘, re.IGORECASE)

這個即可以匹配a,也可以匹配A。

re.DOTALL表示允許.匹配包括\s的內容

re.compile(r‘.*‘, re.DOTALL)

匹配所以內容。


匹配方法:search(), match(), findall(), finditer()

這些是匹配規則查找方法,也可以直接把正則表達式寫在他們的第一個參數的位置(測試時可以,正式編寫不推薦,理由在上面的compile中)而不用compile(),第二個參數是需要匹配的字符串,如

re.search(r‘\d+‘, ‘aa123abc‘)

返回123


search()方法

search()方法進行全字符搜索,返回的是第一個符合條件的match對象,並且它只返回一個,即使後面有其他符合條件的,也不處理,沒有則返回None。

aa = re.compile(r‘\d\d\d+‘)
bb = aa.search(‘aa12345abc678‘)

bb得到返回的包含12345的match對象,而沒有678


match()方法

match()方法從字符串開始處就匹配,且只返回一個符合條件的match對象,相當於正則表達式以r‘^開始,匹配也只返回開始部分,沒有則返回None。

aa = re.compile(r‘\d+‘)
bb = aa.search(‘123ab45‘)

bb得到返回的包含123的match對象,沒有45,且如果字符串變成‘a123ab45‘,則返回None。


findall()方法

findall()方法進行全字符搜索,返回所有符合條件的值,然後組成列表,即返回一個列表對象,沒有則為空列表。

aa = re.compile(r‘\d+‘)
bb = aa.findall(‘a123b45c678‘)

bb得到返回的的列表[‘123‘, ‘45‘, ‘678‘]


finditer()方法

finditer()方法進行全字符串搜索,返回所有符合條件的match對象,然後組成叠代器,用for方法可以看出叠代器裏面是match對象。


這裏match對象有group(), group(index)和groups()方法

可使用它們調用返回的match對象,group()和group(0)都是得到母值,groups()返回所有group(index)組成的元組。


分組和捕獲

在正則表達式中使用圓括號()會產生分組,每個組都是元素,返回一個元組對象,可用group()獲取對於序號的元素:

numRegex = re.compile(r‘(\d)(\d)(\d)‘)

當圓括號內左邊使用?:表示不分組、不捕獲,如:(?:\d)匹配但不分組也不捕獲,不捕獲則不生成match對象。


替換方法sub():

上面已經學習了查找,這個是替換方法,有兩種常用方式,我稱為全部隱藏替換和部分隱藏替換:

全部隱藏替換:

aa = re.compile(r‘engineer (\w)\w+‘)
bb = aa.sub(r‘XX‘, ‘engineer Ricky gave engineer Tom an apple‘)

bb得到字符串‘XX gave XX an apple‘

部分隱藏替換:

aa = re.compile(r‘engineer (\w)\w+‘)
cc = aa.sub(r‘\1**‘, ‘engineer Ricky gave engineer Tom an apple‘)

cc得到字符串‘R** gave T** an apple‘


常用的正則表達式舉例:

r‘^0\d{2,3}-\d{8}‘ 匹配固定電話,如:0755-87226688,010-85332765


本文出自 “RickyHuL” 博客,請務必保留此出處http://rickyh.blog.51cto.com/10934856/1941536

學習正則表達式在python中的應用