Python中re模塊函數使用介紹
Python中通過re模塊實現了正則表達式的功能。re模塊提供了一些根據正則表達式進行查找、替換、分隔字符串的函數。本文主要介紹re模塊中常用的函數和函數常用場景。
re模塊常用函數
1、match(pattern,string,flags=0)
根據pattern從string的頭部開始匹配字符串,只返回第1次匹配成功的對象,否則,返回None。flags表示規則選項。
>>> import re >>> Str=‘Python:Java:C‘ >>> re.match(r‘Python‘,Str) #匹配成功 <_sre.SRE_Match object at 0x0000000005C5FCC8> >>> Str=‘Java:Python:C‘ >>> re.match(r‘Python‘,Str) #匹配失敗 >>>
2、search(pattern,string,flags=0)
根據pattern在string中匹配字符串,只返回第1次匹配成功的對象,否則,返回None。
>>> import re >>> Str=‘Python:Java:C‘ >>> re.search(r‘Python‘,Str) #匹配成功 <_sre.SRE_Match object at 0x00000000060D7D98> >>> Str=‘Java:Python:C‘ >>> re.search(r‘Python‘,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 = r‘Python‘ >>> 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(r‘P.*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(r‘P.*:‘,‘Ruby:‘,Str) #返回替換次數 (‘Ruby:C‘, 1) >>> re.subn(r‘P.*?:‘,‘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(r‘python‘,Str) #匹配失敗 >>> re.match(r‘python‘,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 = r‘Python|Java|C‘ >>> Str1 = ‘Hello Java‘ >>> Str2 = ‘Python Developer‘ >>> p = re.compile(regex) >>> p.findall(Str1) [‘Java‘] >>> p.findall(Str2) [‘Python‘]
Python中re模塊函數使用介紹