首頁  >  文章  >  後端開發  >  Python的re模組正規表示式操作

Python的re模組正規表示式操作

高洛峰
高洛峰原創
2017-03-02 16:08:141208瀏覽

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

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

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

絕大多數正規表示式運算與 模組級函數或RegexObject方法 一樣都能達到相同的目的。而且不需要你一開始就編譯正規表示式對象,但不能使用一些實用的微調參數。

1.正規表示式語法

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

2.martch和search的區別

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

注意:當正規表示式是' ^ '開頭時,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> 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)

#編譯正規表示式,傳回RegexObject對象,然後可以透過RegexObject物件呼叫match()和search()方法。

prog = re.compile(pattern)
result = prog.match(string)


result = re .match(pattern, string)


是等價的。

第一種方式能實作正規表示式的重複使用。


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



在字串中尋找,是否能符合正規表示式。返回_sre.SRE_Match對象,如果不能匹配返回None。



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


字串的開頭是否能符合正規表示式。返回_sre.SRE_Match對象,如果不能匹配返回None。


re.split(pattern, string, maxsplit=0)############透過正規表示式將字串分開。如果用括號將正規表示式括起來,那麼符合的字串也會被列入到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()

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()

清空快取中的正規表示式

4.正規表示式物件




# #re.RegexObject

re.compile()傳回RegexObject物件

#re.MatchObject

##group()傳回被RE 相符的字串


start()傳回符合開始的位置

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


5.編譯標誌

##編譯標誌讓你可以修改正規表示式的一些運行方式。在 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 函數將告訴程式 "é" 也應該被視為一個字母。當在編譯正規表示式時使用 LOCALE 標誌會得到用這些 C 函數來處理 "w 後的編譯物件;這會更慢,但也會像你希望的那樣可以用 "w+ 來匹配法文文本。


M

MULTILINE

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

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


S

DOTALL

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

#########X ###VERBOSE#########

该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。当该标志被指定时,在 RE 字符串中的空白符被忽略,除非该空白符在字符类中或在反斜杠之後;这可以让你更清晰地组织和缩进 RE。它也可以允许你将注释写入 RE,这些注释会被引擎忽略;注释用 "#"号 来标识,不过该符号不能在字符串或反斜杠之後。

最后:如果能用字符串的方法,就不要选择正则表达式,因为字符串方法更简单快速。

更多Python的re模块正则表达式操作相关文章请关注PHP中文网!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn