python核心編程-第十五章-我的筆記

1.正則表達式使用的特殊符號和字符python

    1.0  最多見的符號和字符,以下圖:正則表達式

    

   

    這裏,反義指的是反義詞的意思。如 \w匹配任何數字或者字母, \W 匹配非字母且非數字的字符閉包

    1.1  用"|" 匹配多個正則表達式模式app

        "|"即管道符號,表示或的操做,意思是選擇被管道符號分隔開的多個表達式中的一個。"或"操做有時也被叫作「聯合」,或者「邏輯或」。下面是例子:dom

        

    1.2  匹配任意一個單個的字符 "."函數

        "." 匹配除換行符外的任意一個單個字符,不管字母、數字,仍是除換行符之外的空白符("\t" "\r"等)、可打印字符、不可打印字符等等,均可匹配。若要匹配 . 自己,則需加一個反斜槓轉義。code

        

    1.3  從字符串的開頭、結尾、單詞邊界開始匹配 ("^"  "$"  "\b" "\B")對象

        "^"或者"\A"從字符串開始匹配;"$" 或者"\Z" 從字符串結尾開始匹配。若要匹配這兩個字符自己,也須要用轉義 "\"字符串

        "\b" 匹配的模式是單詞邊界,意思是它匹配的正則模式必定在單詞(單詞可理解爲"\w"所能匹配的字符集合)的開頭,不管這個單詞在一行的起始處仍是在字符串中間。"\B"只匹配出如今單詞中間的模式(即不在單詞的邊界)string

        

    1.4  方括號"[]"用來匹配某個特定的單字符。使用方括號的正則表達式匹配方括號裏的任意一個字符:

 

        對僅有單個字符的正則表達式,方括號和或操做等價,好比咱們想匹配"a"、"b"中的一個;可是若咱們想匹配"ab"和"cd"中的一個時,則不能選擇[abcd],只能選"ab|cd"

        另外,方括號除匹配單個字符外,還支持"-"鏈接的字符範圍,如[A-Z]表明全部大寫字母,[a-z]表明小寫字母,[0-9]表明十進制數字。若左方塊括號以後的第一個字符是"^",則表示不匹配方括號裏的任何字符。

 

    1.5  使用閉包操做符實現重複匹配

        "*"號匹配它左邊的正則表達式出現0次或0次以上的狀況,"+"號匹配它左邊的正則式出現1次或更屢次的狀況,而"?"號匹配它左邊的正則式出現0次或1次的狀況。對於花括號"{}",花括號裏如果單個值,如"{N}",則表示匹配出現N次的狀況;如果逗號隔開的一對值,如"{M, N}",則表示匹配出現M次到N次的狀況。一樣,反斜線轉義後則匹配符號自己。

    

2.  正則表達式和python語言

    2.1  re模塊的核心函數和方法

    

    2.2  用 match() 匹配字符串

        match() 函數試圖從字符串的開始對字符串進行匹配,匹配成功的話返回一個匹配對象,不然返回None。匹配對象的 group() 方法能夠用來顯示成功的匹配。

        當模式匹配成功時調用匹配對象的 group()  方法會顯示成功的匹配

        

       當模式匹配失敗時,返回None,此時調用 group() 方法會報錯:

        

        if 語句就是爲了防止出現 AttributeError 的情形

        另外,即便字符串比正則模式長,也可能匹配成功,只要模式是從字符串的開頭開始匹配的:

>>> m = re.match('foo', 'food on the table')
>>> m.group()
'foo'

        也能夠省略中間過程,直接返回結果:

>>> re.match('foo', 'food on the table').group()
'foo'

        當匹配不成功時,一樣會引起 AttributeError

    2.3  用 search() 搜索字符串

        search() 與march() 工做方式同樣,不一樣之處在於 search() 會搜索(從左至右搜索)字符串中模式首次出現的位置,若是搜索到則匹配成功,返回匹配對象,不然返回None。參看下面的例子。

>>> m = re.match('foo', 'seafood')
>>> if m is not None: m.group()
... 
>>> 
>>> # 無返回結果,說明匹配不成功。但 'foo' 確實在 'seafood'中,此時就是search() 的用處
>>> m = re.search('foo', 'seafood')    # 使用search()
>>> if m is not None: m.group()
...
'foo'

    2.4  運用特殊字符和符號的正則表達式使用案例

        2.4.1  匹配多個字符串(|)

        

        2.4.2  匹配任意單個字符

        

        2.4.3  建立字符集合 []

        下面的例子進一步說明 "|"和"[]"的區別

        

        2.4.4  group() 和groups()

        經過例子來理解 group() 和groups()

        

        如上例,group() 一般用來顯示全部匹配,也可用來獲取個別匹配的子組。groups()方法則能夠得到一個包含全部匹配的子組的元組。下面經過子組的排列組合,更透徹的理解兩者。

        

        

        2.4.5  匹配字符串開頭、結尾或單詞邊界

        ^ $ \b 主要用於search()而不是match(),由於match()老是從字符串開頭匹配

          

        2.4.6  findall()

        findall()匹配方式相似於search(),不一樣之處在於前者老是返回一個列表,若沒有找到匹配部分返回空列表,找到匹配部分則返回全部匹配部分的列表,從左到右的順序排列。

        

        2.4.7  subn()和sub()

        sub()和sub()都用於搜索替換,將某字符串中匹配正則表達式模式的部分進行替換,用來替換的部分一般是一個字符串,或者是一個返回字符串的函數。subn()還返回一個表示替換次數的數字,替換後的字符串和表示替換次數的數字做爲一個元組的元素返回

        

        2.4.8  split()

        re模塊的split()方法相似字符串的split()方法,前者根據正則表達式模式分割字符串,後者根據固定的字符串分割,故前者更靈活。另外,還能夠設置一個參數來限制分割的次數。

        若分隔符沒有使用由特殊符號組成的正則表達式匹配,那麼re.split()和string.split()執行過程是同樣的

        

3. 正則表達式示例

    A. 生成用於正則表達式練習的數據       

#!/usr/bin/env python

from random import randint, choice
from string import lowercase
from sys import maxint
from time import ctime

f = open(r"E:\code\Core Python Programming\15\data.txt", 'w')

doms = ('com', 'edu', 'net', 'org', 'gov')
datas = []

for i in range(randint(5, 10)):
    dtint = randint(0, maxint-1)
    dtstr = ctime(dtint)
    
    shorter = randint(4, 7)
    em = ''
    for j in range(shorter):
        em += choice(lowercase)
        
    longer = randint(shorter, 12)
    dn = ''
    for j in range(longer):
        dn += choice(lowercase)
        
    eachline = '%s::%s@%s.%s::%d-%d-%d' % (dtstr, em,
        dn, choice(doms), dtint, shorter, longer)
    datas.append(eachline)    
    print eachline
    
    f.writelines(eachline+'\n')
f.close()

data = datas[randint(0, len(datas)-1)]

    B.匹配、提取時間戳中有關星期的數據。用正則表達式"^Mon|^Tue|^Wed|^Thu|^Fri|^Sat|^Sun",或者只用一個 ^符號,將星期字符串歸爲一組:"^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) "

    

    這裏也能夠發現,未分組時 gropu(1) 會報錯

    C. 限制更鬆的狀況:匹配以三個數字或者字母組成的字符爲開頭的字符串:"^\w{3}" 或者 "^(\w{3})",後者是分組的狀況

    

    如上,當把匹配模式的{3}寫在括號裏面時,表示匹配三個連續的、由字母或數字組成的字符,再把這三個字符視爲一個組。但若是把{3}挪到括號外面時,含義就變成三個連續的、單個數字或字母的字符。

    D.  經過匹配末尾的三個整型來加深理解match() 和 search(),這裏用search()明顯更方便。用match則需注意貪婪模式。

    

    如上,在使用 search()搜索時沒有問題,在匹配時,即便考慮到分組、考慮到要匹配整行數據,取得的結果還是不正確,緣由就在於正則表達式默認是貪婪模式。貪婪/貪心模式是指,正則表達式中含通配字符時,在從左到右的取值時,會盡可能抓取知足匹配的最長字符串。解決辦法是用非貪婪操做符 "?",問號放在?、*、+後面,表示要求正則表達式匹配的字符越少越好。

    

用搜索 search()能夠只獲取中間的那個整型部分:

            

相關文章
相關標籤/搜索