chapter15 正則表達式

核心編程


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

記號         說明                                         舉例程序員

literal       匹配字符串的值                             foo正則表達式


re1|re2       匹配字符串1或者2 foo|bar 編程



.              匹配任意字符(換行符除外)             b.b閉包


^               匹配字符串的開始                      ^bardom

$                匹配字符串的結尾                      bar$函數


*               匹配前面出現的正則表達式零次或屢次     bar*搜索引擎


+               匹配前面出現的正則表達式一次或屢次     bar+spa


?                匹配前面出現的正則表達式一次或零次    bar?code



{N}                匹配前面出現的正則表達式N次       [0-9]{5}


{M,N}              匹配重複出現M次到N次的正則表達式   [0,9]{6,9}


[...]             匹配字符組裏出現的任意一個字符      [dghjkl]


[..X-Y..]         匹配從字符x到y中的任意一個字符      [0-9a-z]


[^...]           不匹配此字符集中出現的任意一個字符   [^dghjkl]


(*|+|?|{})?       因爲上面出現的任何‘非貪婪’版本重複匹配次數符號   .*?[a-z]

                   (*,+,?,{})


(...)            匹配封閉括號中正則表達式(RE),並保持爲子組   ([0-9]{3}?,f(oo|u)bat)





special characters


\d        匹配任何數字,和[0-9]同樣(\D是\d的反義:任何非數字符)      data\d+.txt


\w        匹配任何數字字母字符,和[A-Za-z0-9]相同(\W是\w的反義)    [A-Za-z_]\w+


\s        匹配任何空白符,和[\n\t\r\f]相同,(\S是\s的反義)           of\sthe


\b        匹配單詞的邊界(\B是\b的反義)                                \blove\b


\nn       匹配已保存的子組                                         print:\16


\c        逐一匹配特殊字符c                                        \.,\*,\\,\?


\A (\Z)  匹配字符串的起始(結束)                                   \Adear



\A 和^是同樣的,\Z 和$是同樣的。


^/$ /\b /\B

「matching」和「searching」 之間的區別,「matching」是試圖從整個字符串的開頭進行匹配,而 「searching」 則可從一個字符串的任意位置開始匹配。正由於這幾個字符和搜索的位置有關,因此須要和搜索模式一塊兒使用

示例:


^From 匹配任何以From 開始的字符串

/bin/tcsh$ 匹配任何以 /bin/tcsh 結束的字符串

^Subject: hi$ 匹配僅由 Subject: hi 組成的字符串


RE Pattern Strings Matched

the 任何包含有"the"的字符串

\bthe 任何以"the"開始的字符串

\bthe\b 僅匹配單詞 「the」

\Bthe 任意包含「the」但不以「the」開頭的單詞



建立字符類[]:[abcd],[1-9]匹配其中任意一個字符, 很簡單沒什麼好說的

使用閉包操做符 ( *, +, ?, {} ) 實現屢次出現/重複匹配


'?'的特殊做用:

問號出現了不僅一次(被重載),問號有兩種含義:1.單獨使用時表示匹配出現零次或一次的狀況,2.緊跟在表示重複的元字符後面時,表示要求搜索引擎匹配的字符串越短越好。例如:(+?)




match 和searching的區別:

match:匹配是指,判斷一個字符串可否從起始處所有或部分的匹配某個模式

searching;搜索,即在字符串任意部分中查找匹配的模式


常見的正則表達式函數與方法


函數/方法                      描述

re 模塊的函數

compile(pattern,flags=0)      對正則表達式模式pattern 進行編譯,flags 是可選標誌符,並返回一                               個regex 對象


match(pattern,string, flags=0)  嘗試用正則表達式模式pattern 匹配字符串string,flags 是可選標誌                                符,若是匹配成功,則返回一個匹配對象;不然返回None


search(pattern,string, flags=0) v在字符串string 中查找正則表達式模式pattern 的第

                                 一次出現,flags 是可選標誌符,若是匹配成功,則返回一個匹配對                                 象;不然返回None


findall(pattern,string[,flags])  在字符串string 中查找正則表達式模式pattern 的全部(非重複)出                                    現;返回一個匹配對象的列表

finditer(pattern,string[, flags])  和findall()相同,但返回的不是列表而是迭代器;對於每一個匹配                                    ,該迭代器返回一個匹配對象


split(pattern,string, max=0)          根據正則表達式pattern 中的分隔符把字符string 分割爲一個                                    列表,返回成功匹配的列表,最多分割max 次(默認是分割全部匹                                    配 的地方)。


sub(pattern, repl, string, max=0)       把字符串string 中全部匹配正則表達式pattern 的地方替換                                          成字符串repl,若是max 的值沒有給出,則對全部匹配的地                                        方進行替換(另外,請參考subn(),它還會返回一個表示替換                                          次數的數值)。

group(num=0)                           返回所有匹配對象(或指定編號是num 的子組)

groups()                             返回一個包含所有匹配的子組的元組(若是沒有成功匹配,就返                                      回一個空元組)



m=re.match('foo','foo')

if m is not None:

    m.group()


核心筆記 : Python 原始字符串(raw strings)的用法

你可能已經看到前面關於原始字符串用法的一些例子了。原始字符串的產生正是因爲有正則表

達式的存在。緣由是ASCII 字符和正則表達式特殊字符間所產生的衝突。好比,特殊符號「\b」在

ASCII 字符中表明退格鍵,但同時「\b」也是一個正則表達式的特殊符號,表明「匹配一個單詞邊界」。

爲了讓RE 編譯器把兩個字符「\b」當成你想要表達的字符串,而不是一個退格鍵,你須要用另外一個

反斜線對它進行轉義,便可以這樣寫:「\\b」。

但這樣作會把問題複雜化,特別是當你的正則表達式字符串裏有不少特殊字符時,就更容

易使人困惑了。在第六章,咱們曾介紹過原始字符串,它常常被用於簡化正則表達式的複雜程度。

事實上,不少Python 程序員在定義正則表達式時都只使用原始字符串。

(r'\bblow')



正則表達式示例:


from random import randint, choice

from string import lowercase

from sys import maxint

from time import ctime


doms = ( 'com', 'edu', 'net', 'org', 'gov' )

t=range(randint(5, 10))

print t

for i in t:

    dtint=randint(0, maxint-1) # pick date

    print dtint

    dtstr=ctime(dtint) # date string


    shorter = randint(4, 7) # login shorter

    em = ''

    for j in range(shorter):

        em += choice(lowercase)

    longer = randint(shorter, 12) # domain longer

    dn = ''

    for j in range(longer):

        dn += choice(lowercase)


    print '%s::%s@%s.%s::%d-%d-%d' % (dtstr, em,dn, choice(doms), dtint, shorter, longer)


匹配一個字符串:

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息