Python—正則表達(dá)式基礎(chǔ)

我將從正則表達(dá)式開始講Python的標(biāo)準(zhǔn)庫。正則表達(dá)式是文字處理中常用的工具,而且不需要額外的系統(tǒng)知識(shí)或經(jīng)驗(yàn)。我們會(huì)把系統(tǒng)相關(guān)的包放在后面講解。

正則表達(dá)式(regular expression)主要功能是從字符串(string)中通過特定的模式(pattern),搜索想要找到的內(nèi)容。
語法
之前,我們簡介了字符串相關(guān)的處理函數(shù)。我們可以通過這些函數(shù)實(shí)現(xiàn)簡單的搜索功能,比如說從字符串“I love you”中搜索是否有“you”這一子字符串。但有些時(shí)候,我們只是模糊地知道我們想要找什么,而不能具體說出我是在找“you”,比如說,我想找出字符串中包含的數(shù)字,這些數(shù)字可以是0到9中的任何一個(gè)。這些模糊的目標(biāo)可以作為信息寫入正則表達(dá)式,傳遞給Python,從而讓Python知道我們想要找的是什么。
(官方documentation)
在Python中使用正則表達(dá)式需要標(biāo)準(zhǔn)庫中的一個(gè)包re。

import rem = re.search('[0-9]','abcd4ef')print(m.group(0))

re.search()接收兩個(gè)參數(shù),第一個(gè)'[0-9]'就是我們所說的正則表達(dá)式,它告訴Python的是,“聽著,我從字符串想要找的是從0到9的一個(gè)數(shù)字字符”。
re.search()如果從第二個(gè)參數(shù)找到符合要求的子字符串,就返回一個(gè)對(duì)象m,你可以通過m.group()的方法查看搜索到的結(jié)果。如果沒有找到符合要求的字符,re.search()會(huì)返回None。

如果你熟悉Linux或者Perl, 你應(yīng)該已經(jīng)熟悉正則表達(dá)式。當(dāng)我們打開Linux shell的時(shí)候,可以用正則表達(dá)式去查找或著刪除我們想要的文件,比如說:
$rm book[0-9][0-9].txt
這就是要?jiǎng)h除類似于book02.txt的文件。book[0-9][0-9].txt所包含的信息是,以book開頭,后面跟兩個(gè)數(shù)字字符,之后跟有".txt"的文件名。如果不符合條件的文件名,比如說:
bo12.txt
book1.txt
book99.text
都不會(huì)被選中。
Perl中內(nèi)建有正則表達(dá)式的功能,據(jù)說是所有正則表達(dá)式系統(tǒng)中最強(qiáng)的,這也是Perl成為系統(tǒng)管理員利器的一個(gè)原因。

正則表達(dá)式的函數(shù)
m = re.search(pattern, string) # 搜索整個(gè)字符串,直到發(fā)現(xiàn)符合的子字符串。m = re.match(pattern, string) # 從頭開始檢查字符串是否符合正則表達(dá)式。必須從字符串的第一個(gè)字符開始就相符。

可以從這兩個(gè)函數(shù)中選擇一個(gè)進(jìn)行搜索。上面的例子中,我們?nèi)绻褂胷e.match()的話,則會(huì)得到None,因?yàn)樽址钠鹗紴椤產(chǎn)’, 不符合'[0-9]'的要求。
對(duì)于返回的m, 我們使用m.group()來調(diào)用結(jié)果。(我們會(huì)在后面更詳細(xì)解釋m.group())

我們還可以在搜索之后將搜索到的子字符串進(jìn)行替換:
str = re.sub(pattern, replacement, string)# 在string中利用正則變換pattern進(jìn)行搜索,對(duì)于搜索到的字符串,用另一字符串replacement替換。返回替換后的字符串。

此外,常用的正則表達(dá)式函數(shù)還有
re.split() # 根據(jù)正則表達(dá)式分割字符串, 將分割后的所有子字符串放在一個(gè)表(list)中返回
re.findall() # 根據(jù)正則表達(dá)式搜索字符串,將所有符合的子字符串放在一給表(list)中返回

(在熟悉了上面的函數(shù)后,可以看一下re.compile(),以便于提高搜索效率。)

寫一個(gè)正則表達(dá)式
關(guān)鍵在于將信息寫成一個(gè)正則表達(dá)式。我們先看正則表達(dá)式的常用語法:
1)單個(gè)字符:
. 任意的一個(gè)字符
a|b 字符a或字符b
[afg] a或者f或者g的一個(gè)字符
[0-4] 0-4范圍內(nèi)的一個(gè)字符
[a-f] a-f范圍內(nèi)的一個(gè)字符
[^m] 不是m的一個(gè)字符
\s 一個(gè)空格
\S 一個(gè)非空格
\d [0-9]
\D [^0-9]
\w [0-9a-zA-Z]
\W [^0-9a-zA-Z]

2)重復(fù)
緊跟在單個(gè)字符之后,表示多個(gè)這樣類似的字符

  •     重復(fù) >=0 次
    
  •     重復(fù) >=1 次
    

? 重復(fù) 0或者1 次
{m} 重復(fù)m次。比如說 a{4}相當(dāng)于aaaa,再比如說[1-3]{2}相當(dāng)于[1-3][1-3]
{m, n} 重復(fù)m到n次。比如說a{2, 5}表示a重復(fù)2到5次。小于m次的重復(fù),或者大于n次的重復(fù)都不符合條件。

正則表達(dá) 相符的字符串舉例
[0-9]{3,5} 9678
a?b b
a+b aaaaab

  1. 位置
    ^ 字符串的起始位置
    $ 字符串的結(jié)尾位置

正則表達(dá) 相符的字符串舉例 不相符字符串
^ab.*c$ abeec cabeec (如果用re.search(), 將無法找到。)
4)返回控制
我們有可能對(duì)搜索的結(jié)果進(jìn)行進(jìn)一步精簡信息。比如下面一個(gè)正則表達(dá)式:
output_(\d{4})
該正則表達(dá)式用括號(hào)()包圍了一個(gè)小的正則表達(dá)式,\d{4}。 這個(gè)小的正則表達(dá)式被用于從結(jié)果中篩選想要的信息(在這里是四位數(shù)字)。這樣被括號(hào)圈起來的正則表達(dá)式的一部分,稱為群(group)。我們可以m.group(number)的方法來查詢?nèi)?。group(0)是整個(gè)正則表達(dá)的搜索結(jié)果,group(1)是第一個(gè)群……

import rem = re.search("output_(\d{4})", "output_1986.txt")print(m.group(1))

我們還可以將群命名,以便更好地使用m.group查詢:

import rem = re.search("output_(?P<year>\d{4})", "output_1986.txt") #(?P<name>...) 

為group命名print(m.group("year"))

練習(xí)有一個(gè)文件,文件名為output_1981.10.21.txt 。下面使用Python: 讀取文件名中的日期時(shí)間信息,并找出這一天是周幾。將文件改名為output_YYYY-MM-DD-W.txt (YYYY:四位的年,MM:兩位的月份,DD:兩位的日,W:一位的周幾,并假設(shè)周一為一周第一天)

本文轉(zhuǎn)載自:Vamei的博客,如需了解更多內(nèi)容,請(qǐng)移步至:http://www.cnblogs.com/vamei

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • re模塊手冊(cè) 本模塊提供了和Perl里的正則表達(dá)式類似的功能,不關(guān)是正則表達(dá)式本身還是被搜索的字符串,都可以...
    喜歡吃栗子閱讀 4,198評(píng)論 0 13
  • 本文介紹了Python對(duì)于正則表達(dá)式的支持,包括正則表達(dá)式基礎(chǔ)以及Python正則表達(dá)式標(biāo)準(zhǔn)庫的完整介紹及使用示例...
    Python程序媛閱讀 1,449評(píng)論 0 22
  • 正則表達(dá)式到底是什么東西?字符是計(jì)算機(jī)軟件處理文字時(shí)最基本的單位,可能是字母,數(shù)字,標(biāo)點(diǎn)符號(hào),空格,換行符,漢字等...
    獅子挽歌閱讀 2,285評(píng)論 0 9
  • 5,重復(fù) 正則表達(dá)式可以匹配不定長的字符集,另外也可以指定字符串的重復(fù)次數(shù)。 * (星號(hào)) 指定前一個(gè)字符可以匹配...
    挖地瓜閱讀 3,040評(píng)論 0 7
  • 夜霧惺忪,樹影朦朦。云幕褪、星碎蒼穹。蜉蝣一夢,年歲匆匆。對(duì)杯中酒,酒中月,月中風(fēng)。 重陽又至,登高懷思,且長歌、...
    瑾檀yuying閱讀 726評(píng)論 50 42

友情鏈接更多精彩內(nèi)容