Python之re模組 —— Regex操作,pythonre

來源:互聯網
上載者:User

Python之re模組 —— Regex操作,pythonre

這個模組提供了與 Perl 相似l的Regex匹配操作。Unicode字串也同樣適用。

 

Regex使用反斜線" \ "來代表特殊形式或用作逸出字元,這裡跟Python的文法衝突,因此,Python用" \\\\ "表示Regex中的" \ ",因為Regex中如果要匹配" \ ",需要用\來轉義,變成" \\ ",而Python文法中又需要對字串中每一個\進行轉義,所以就變成了" \\\\ "。

 

上面的寫法是不是覺得很麻煩,為了使Regex具有更好的可讀性,Python特別設計了原始字串(raw string),需要提醒你的是,在寫檔案路徑的時候就不要使用raw string了,這裡存在陷阱。raw string就是用'r'作為字串的首碼,如 r"\n":表示兩個字元"\"和"n",而不是分行符號了。Python中寫Regex時推薦使用這種形式。

 

絕大多數Regex操作與 模組層級函數或RegexObject方法 一樣都能達到同樣的目的。而且不需要你一開始就編譯Regex對象,但是不能使用一些實用的微調參數。

 

1.Regex文法

        為了節省篇幅,這裡不再敘述了。

 

2.martch和search的區別

        Python提供了兩種不同的原始操作:match和search。match是從字串的起點開始做匹配,而search(perl預設)是從字串做任意匹配。

 

        注意:當Regex是' ^ '開頭時,match與search是相同的。match只有若且唯若被匹配的字串開頭就能匹配 或 從pos參數的位置開始就能匹配 時才會成功。如下:

>>> import re 
>>> re.match("c", "abcdef") 
>>> re.search("c","abcdef") 
<_sre.SRE_Match object at 0x00A9A988>

>>> re.match("c", "cabcdef") 
<_sre.SRE_Match object at 0x00A9AB80>

>>> re.search("c","cabcdef") 
<_sre.SRE_Match object at 0x00AF1720>

>>> patterm = re.compile("c") 
>>> patterm.match("abcdef") 
>>> patterm.match("abcdef",1) 
>>> patterm.match("abcdef",2) 
<_sre.SRE_Match object at 0x00A9AB80>

3.模組內容re.compile(pattern, flags=0)

 

編譯Regex,返回RegexObject對象,然後可以通過RegexObject對象調用match()和search()方法。

 

prog = re.compile(pattern)

result = prog.match(string)

跟

result = re.match(pattern, string)

是等價的。

 

第一種方式能實現Regex的重用。

 

re.search(pattern, string, flags=0)

 

在字串中尋找,是否能匹配Regex。返回_sre.SRE_Match對象,如果不能匹配返回None。

 

re.match(pattern, string, flags=0)

 

字串的開頭是否能匹配Regex。返回_sre.SRE_Match對象,如果不能匹配返回None。

 

re.split(pattern, string, maxsplit=0)

 

通過Regex將字串分離。如果用括弧將Regex括起來,那麼匹配的字串也會被列入到list中返回。maxsplit是分離的次數,maxsplit=1分離一次,預設為0,不限制次數。

>>> re.split('\W+', 'Words, words, words.') 
['Words', 'words', 'words', ''] 
>>> re.split('(\W+)', 'Words, words, words.') 
['Words', ', ', 'words', ', ', 'words', '.', ''] 
>>> re.split('\W+', 'Words, words, words.', 1) 
['Words', 'words, words.'] 
>>> re.split('[a-f]+', '0a3B9', flags=re.IGNORECASE)

 

注意:我使用的Python是2.6,查看原始碼發現split()並沒有flags的參數,2.7才增加。這種問題我發現不止一次了,官方的文檔 跟 源碼不一致的現象,如果發現異常,應該去源碼中找找原因。

 

如果在字串的開始或結尾就匹配,返回的list將會以空串開始或結尾。

>>> re.split('(\W+)', '...words, words...') 
['', '...', 'words', ', ', 'words', '...', '']

 

如果字串不能匹配,將會返回整個字串的list。

>>> re.split("a","bbb") 
['bbb']

 

re.findall(pattern, string, flags=0)

 

找到 RE 匹配的所有子串,並把它們作為一個列表返回。這個匹配是從左至右有序地返回。如果無匹配,返回空列表。

>>> re.findall("a","bcdef") 
[]

>>> re.findall(r"\d+","12a32bc43jf3") 
['12', '32', '43', '3']

 

re.finditer(pattern, string, flags=0)

 

找到 RE 匹配的所有子串,並把它們作為一個迭代器返回。這個匹配是從左至右有序地返回。如果無匹配,返回空列表。

>>> it = re.finditer(r"\d+","12a32bc43jf3") 
>>> for match in it: 
              print match.group()

12 
32 
43 
3

 

re.sub(pattern, repl, string, count=0, flags=0)

 

找到 RE 匹配的所有子串,並將其用一個不同的字串替換。選擇性參數 count 是模式比對後替換的最大次數;count 必須是非負整數。預設值是 0 表示替換所有的匹配。如果無匹配,字串將會無改變地返回。

 

re.subn(pattern, repl, string, count=0, flags=0) 

與re.sub方法作用一樣,但返回的是包含新字串和替換執行次數的兩元組。

 

re.escape(string)

 

對字串中的非字母數字進行轉義

 

re.purge()

 

清空緩衝中的Regex

 

4.Regex對象

 

re.RegexObject

 

re.compile()返回RegexObject對象

 

re.MatchObject

 

group()返回被 RE 匹配的字串

start()返回匹配開始的位置

end()返回匹配結束的位置

span()返回一個元組包含匹配 (開始,結束) 的位置

 

5.編譯標誌

編譯標誌讓你可以修改Regex的一些運行方式。在 re 模組中標誌可以使用兩個名字,一個是全名如 IGNORECASE,一個是縮寫,一字母形式如 I。(如果你熟悉 Perl 的模式修改,一字母形式使用同樣的字母;例如 re.VERBOSE的縮寫形式是 re.X。)多個標誌可以通過按位 OR-ing 它們來指定。如 re.I | re.M 被設定成 I 和 M 標誌:

I 
IGNORECASE

使匹配對大小寫不敏感;字元類和字串匹配字母時忽略大小寫。舉個例子,[A-Z]也可以匹配小寫字母,Spam 可以匹配 "Spam", "spam", 或 "spAM"。這個小寫字母並不考慮當前位置。

L 
LOCALE

影響 "w, "W, "b, 和 "B,這取決於當前的本地化設定。

locales 是 C 語言庫中的一項功能,是用來為需要考慮不同語言的編程提供協助的。舉個例子,如果你正在處理法文文本,你想用 "w+ 來匹配文字,但 "w 只匹配字元類 [A-Za-z];它並不能匹配 "é" 或 "?"。如果你的系統配置適當且本地化設定為法語,那麼內部的 C 函數將告訴程式 "é" 也應該被認為是一個字母。當在編譯Regex時使用 LOCALE 標誌會得到用這些 C 函數來處理 "w 後的編譯對象;這會更慢,但也會象你希望的那樣可以用 "w+ 來匹配法文文本。

M 
MULTILINE

(此時 ^ 和 $ 不會被解釋; 它們將在 4.1 節被介紹.)

使用 "^" 只匹配字串的開始,而 $ 則只匹配字串的結尾和直接在換行前(如果有的話)的字串結尾。當本標誌指定後, "^" 匹配字串的開始和字串中每行的開始。同樣的, $ 元字元匹配字串結尾和字串中每行的結尾(直接在每個換行之前)。

S 
DOTALL

使 "." 特殊字元完全符合任何字元,包括換行;沒有這個標誌, "." 匹配除了換行外的任何字元。

X 
VERBOSE

該標誌通過給予你更靈活的格式以便你將Regex寫得更易於理解。當該標誌被指定時,在 RE 字串中的空白符被忽略,除非該空白符在字元類中或在反斜線之後;這可以讓你更清晰地組織和縮排 RE。它也可以允許你將注釋寫入 RE,這些注釋會被引擎忽略;注釋用 "#"號 來標識,不過該符號不能在字串或反斜線之後。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.