Python 學習之路 - Regex

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.