核心編程
正則表達式使用的特殊符號和字符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)
匹配一個字符串: