1. 程式人生 > >Python中re模塊函數使用介紹

Python中re模塊函數使用介紹

表達式 方式 字符串的匹配 re.sub earch mic 多語言 第一個元素 不同

Python中通過re模塊實現了正則表達式的功能。re模塊提供了一些根據正則表達式進行查找、替換、分隔字符串的函數。本文主要介紹re模塊中常用的函數和函數常用場景。

re模塊常用函數

1、match(pattern,string,flags=0)

根據pattern從string的頭部開始匹配字符串,只返回第1次匹配成功的對象,否則,返回None。flags表示規則選項。

>>> import re
>>> Str=Python:Java:C
>>> re.match(rPython,Str) #匹配成功
<_sre.SRE_Match object at 0x0000000005C5FCC8>
>>> Str=
Java:Python:C >>> re.match(rPython,Str) #匹配失敗 >>>

2、search(pattern,string,flags=0)

根據pattern在string中匹配字符串,只返回第1次匹配成功的對象,否則,返回None。

>>> import re
>>> Str=Python:Java:C
>>> re.search(rPython,Str) #匹配成功
<_sre.SRE_Match object at 0x00000000060D7D98>
>>> Str=
Java:Python:C >>> re.search(rPython,Str) #同樣匹配成功 <_sre.SRE_Match object at 0x0000000005C5FCC8>

3、split(pattern,string,maxsplit=0)

根據pattern分隔string,maxsplit表示最大分隔數。

>>> import re
>>> Str=Python:Java:C
>>> re.split(r:,Str) #指定分隔符:
[Python, Java, C]
>>> Str=
Python:Java:C >>> re.split(r:,Str,1) #指定最大分割次數 [Python, Java:C] >>> Str = "Python:Java:Shell|C++|Ruby" >>> re.split(r[:|],Str) #指定多種分隔符 [Python, Java, Shell, C++, Ruby]

4、compile(pattern,flags=0)

編譯正則表達式pattern,返回一個pattern對象。

>>> import re
>>> regex = rPython
>>> Str=Python:Java:C
>>> p = re.compile(regex)
>>> p.match(Str)
<_sre.SRE_Match object at 0x00000000060D7D98>

說明:pattern對象方法除了match(),還包括search()、findall()、finditer()。

5、sub(pattern,repl,string,count=0)

根據指定的正則表達式,替換字符串中的子串。pattern是一個正則表達式,repl是用於替換的字符串,string是源字符串,如果count為0,則返回string中匹配的所有結果。如果count>0,則返回前count個匹配結果。

>>> import re
>>> Str=Python:Java:C
>>> re.sub(rP.*n,Ruby,Str)
Ruby:Java:C
>>> print Str #不改變原字符串
Python:Java:C

6、subn(pattern,repl,string,count=0)

作用和sub()相同,返回一個二元元組。第一個元素是替換結果,第2個元素是替換的次數。

>>> import re
>>> Str=Python:Java:C
>>> re.subn(rP.*:,Ruby:,Str) #返回替換次數
(Ruby:C, 1)
>>> re.subn(rP.*?:,Ruby:,Str) #註意匹配中多了個?號,替換內容不同了
(Ruby:Java:C, 1)
>>>

說明:匹配條件中‘P.*?:‘有無問號?號是有區別的。不加?號是貪婪匹配。

7、findall(pattern,string,flags=0)

根據pattern在string中匹配字符串。如果匹配成功,返回包含匹配結果的列表,否則,返回空列表。但pattern中有分組時,返回包含多個元組的列表,每個元組對應一個分組。

>>> import re
>>> regex = r\w+ #\w表示匹配包括下劃線的任何單詞字符
>>> Str=Python:Java:C
>>> p = re.compile(regex)
>>> p.findall(Str)
[Python, Java, C]

描述完re模塊的主要函數後,這裏再強調 函數中的flags參數 和 re.compile() 函數。

1、re.flags參數

通過查看re模塊函數的原型可以發現,函數參數幾乎都有flags參數,該參數用於設置匹配的附加選項。例如,是否忽略大小寫、是否支持多行匹配等。常用的re模塊規則選項如下所示:

I或IGNORECASE 忽略大小寫
L或LOCALE 字符集本地化,用於多語言環境
M或MULTILINE 多行匹配
S或DOTALL 使.匹配包括\n在內的所有字符
X或VERBOSE 忽略正則表達式中的空白、換行,方便添加註釋
U或UNICODE \w、\W、\b、\B、\d、\D、\s和\S都將使用Unicode

通過一個忽略大小寫的實例看下用法:

>>> import re
>>> Str=Python:Java:C
>>> re.match(rpython,Str) #匹配失敗
>>> re.match(rpython,Str,re.I) #加re.I,匹配成功
<_sre.SRE_Match object at 0x00000000060D7D98>

2、re.compile() 函數

正則表達式的解析非常耗時,如果多次使用findall()的方式匹配字符串搜索效率可能比較低。如果多次使用同一規則匹配字符串,可以使用compile()進行預編譯,compile函數返回1個pattern對象。該對象擁有一系列方法用於查找、替換或擴展字符串,從而提供字符串的匹配速度。patter對象的屬性和方法如下

pattern #獲取當前使用的正則表達式
match(string,flags=0) #同re.match()
search(string,flags=0) #同re.searc()
findall(string,flags=0) #查找所有符合pattern對象匹配條件的結果,返回1個包含匹配結果的列表。
finditer(string,flags=0) #返回一個包含匹配結果的地址

另外,函數compile()通常與match()、search()、group()一起使用對含有分組的正則表達式進行解析。正則表達式的分組從左往右開始計數,第1個出現的圓括號標記為第1組,依次類推。此外還有0號組,0號組用於存儲匹配整個正則表達式的結果。match()和search()將返回一個match對象,match對象提供了一系列的方法和屬性來管理匹配的結果。match對象的方法和屬性如下:

group(index=0) #某個分組的匹配結果。默認匹配整個正則表達式
groups() #所有分組的匹配結果,每個分組的結果組成1個列表返回

舉例,匹配身份證號碼並獲取身份證中的年、月、日信息。

>>> regex = r[1-9][0-9]{5}(\d{4})(\d{2})(\d{2})[0-9]{3}[0-9X]
>>> Str = 11010019950807532X
>>> p = re.compile(regex)
>>> m = p.match(Str)
>>> m.groups()
(1995, 08, 07)
>>> m.group(1)
1995
>>> m.group(2)
08
>>> m.group(3)
07

典型實例

1、多關鍵字任一匹配查找

>>> import re
>>> regex = rPython|Java|C
>>> Str1 = Hello Java
>>> Str2 = Python Developer
>>> p = re.compile(regex)
>>> p.findall(Str1)
[Java]
>>> p.findall(Str2)
[Python]

Python中re模塊函數使用介紹