標籤:sub mmm ace port center 執行個體 white search bit
Regex
Regex的大致匹配過程是:依次拿出運算式和文本中的字元比較,如果每一個字元都能匹配,則匹配成功;一旦有匹配不成功的字元則匹配失敗。
re 模組用於Regex的操作。
一、 用於匹配的函數1. findall(pattern,string,flags=0)
匹配字串中所有合格元素。匹配上,返回list類型元素
import reobj = re.findall(‘\d+‘,‘hhh90080mmmbb2233pp‘)print(obj)
2. match(pattern,string,flags=0)
從字串起始位置匹配合格元素,單個匹配。匹配上,返回一個對象
注意:字串起始位置的元素必須與Regex相匹配,不然返回None
import reobj = re.match(‘\d+‘,‘0008lkk‘)print(obj,type(obj))if obj: print(obj.group())
3. search(pattern,string,flags=0)
在字串中尋找匹配的元素,單個匹配。匹配上,返回一個對象
import reobj = re.search(‘\d+‘,‘hhh90080mmmbb2233pp‘)if obj: print(obj.group())
4. group()和groups()
分組是用()進行的,一個Regex可以用括弧進行分組
group()獲得一個,多個分組截獲的字串;或所有分組匹配的整體字串
groups()以元組形式返回全部分組截獲的字串
import rea = "123abc456ooo"print( re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(0)) #編號0代表整個匹配的子串;不填寫參數時,相當於group(0)print( re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(1,2)) #指定多個參數時將以元組形式返回 (‘123‘, ‘abc‘)print(re.search("([0-9]*)([a-z]*)([0-9]*)", a).group(2)) #指定一個參數時返回字串 abcprint (re.search("([0-9]*)([a-z]*)([0-9]*)", a).groups()) #(‘123‘, ‘abc‘, ‘456‘)5. sub(pattern, repl, string, count=0, flags=0)
替換與Regex相匹配的字串
import res = "hello world 001,789 welcome"s_c = re.sub(‘\d+‘,‘amy‘,s,1) #只替換一次,不填count會全部替換print(s_c)
比str.replace()更加強大。
6. split(pattern,string,maxsplit=0,flag=0)
根據指定的正則匹配進行分割。
注意:最後一個字元匹配成功的話,會分割出一個空格
import ren = "split1nnnnn2mmmmm3"n_c = re.split(‘[0-9]‘,n,1) #最多分割一次,不填maxsplit會全部分割print(n_c)
7. compile(
strPattern[, flag])
將字串形式的Regex編譯為一個對象。
import retext = "You are so cool, oo"pattern = re.compile(r‘\w*oo\w*‘) #將Regex編譯成Pattern對象print(pattern.findall(text)) #尋找所有包含oo的單詞,使用Pattern匹配文本,獲得匹配結果,無法匹配時將返回None
二、匹配的文法
| 文法 |
說明 |
運算式執行個體 |
匹配的字串 |
| 字元 |
| 一般字元 |
匹配自身 |
abc |
abc |
| . |
匹配任一字元(除分行符號)
若指定flag DOTALL,則匹配任一字元,包括換行 |
a.c |
akc |
| \ |
逸出字元,使其後的字元變成字面上的字元 |
a\.c |
a.c |
| [...] |
字元集,[a*]匹配字元是a 或 *;’[a-z]匹配a到z之間的任一字元; [^f]匹配非 f 的任一字元;[\d]匹配數字. 字元集中除了 - ^ \ 外,其他特殊字元沒有特殊含義 |
[a*]k |
aK *k |
| 數量(用在字元或(...)之後) |
| * |
匹配前一個字元0或無限次 |
|
|
| + |
匹配前一個字元1或無限次 |
|
|
| ? |
匹配前一個字元0次或1次 |
|
|
| {m} |
匹配前一個字元m次 |
|
|
| {m,n} |
匹配前一個字元m到n次,省略m,0到n;省略n,m到無限 |
|
|
| 預定義字元(可以寫在[]字元集中) |
| \d |
數字:[0-9] |
|
|
| \D |
非數字:[^\d] |
|
|
| \w |
字母數字底線:[A-Za-z0-9_] |
|
|
| \W |
[^\W] |
|
|
| 邊界匹配 |
|
|
|
| ^ |
匹配字串開頭 |
^abc |
abc |
$ |
匹配字串結尾 |
abc$ |
abc |
| \A |
僅僅匹配字串開頭 |
\Aabc |
abc |
| \Z |
僅僅匹配字串結尾 |
abc\Z |
abc |
| \b |
匹配\w和\W之間;單詞的開始或結束 |
a\b!bc |
a!bc |
| \B |
[^\b] |
a\Bbc |
abc |
| 邏輯,分組 |
| | |
|代表左右運算式任意匹配一個。從左 往右匹配,左邊的匹配成功便跳過右邊 |
abc|def |
abc dfe |
| (...) |
被括起來的運算式將作為分組;分組表 達式作為一個整體,後面可以接數量。運算式 中的 | 只在該組中有效。
從運算式的左邊開始沒遇到一個分組的左括弧, 編號就加1 |
(abc){2}
a(123|456)c |
abcabc
a456c |
三、flag
# flagsI = IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE # ignore caseL = LOCALE = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit localeU = UNICODE = sre_compile.SRE_FLAG_UNICODE # assume unicode localeM = MULTILINE = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newlineS = DOTALL = sre_compile.SRE_FLAG_DOTALL # make dot match newlineX = VERBOSE = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments
四、r 原生字元
Regex裡使用"\"作為逸出字元,這就可能造成反斜線困擾。假如你需要匹配文本中的字元"\",那麼使用程式設計語言表示的Regex裡將需要4個反斜線"\\\\":前兩個和後兩個分別用於在程式設計語言裡轉義成反斜線,轉換成兩個反斜線後再在Regex裡轉義成一個反斜線。Python裡的原生字串很好地解決了這個問題,這個例子中的Regex可以使用r"\\"表示。同樣,匹配一個數位"\\d"可以寫成r"\d"。有了原生字串,你再也不用擔心是不是漏寫了反斜線,寫出來的運算式也更直觀。
學習內容來自:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
Python 學習之路 - Regex