正則表達式是一個特殊的字元序列,它能幫助你方便的檢查一個字元串是否與某種模式匹配。 re 模塊使 Python 語言擁有全部的正則表達式功能。 compile 函數根據一個模式字元串和可選的標誌參數生成一個正則表達式對象。該對象擁有一系列方法用於正則表達式匹配和替換。 re 模塊也提供了與這些方法功 ...
正則表達式是一個特殊的字元序列,它能幫助你方便的檢查一個字元串是否與某種模式匹配。
re 模塊使 Python 語言擁有全部的正則表達式功能。
compile 函數根據一個模式字元串和可選的標誌參數生成一個正則表達式對象。該對象擁有一系列方法用於正則表達式匹配和替換。
re 模塊也提供了與這些方法功能完全一致的函數,這些函數使用一個模式字元串做為它們的第一個參數
1.正則表達式修飾符 --可選標誌
正則表達式可以包含一些可選標誌修飾符來控制匹配的模式
修飾符被指定為一個可選的標誌。多個標誌可以通過按位OR(|)來指定。如re.I | re.M 被設置成I 和M 的標誌
修飾符 | 描述 |
---|---|
re.I | 使匹配對大小寫不敏感 |
re.L | 做本地化識別(locale-aware)匹配 |
re.M | 多行匹配,影響 ^ 和 $ |
re.S | 使 . 匹配包括換行在內的所有字元 |
re.U | 根據Unicode字元集解析字元。這個標誌影響 \w, \W, \b, \B. |
re.X | 該標誌通過給予你更靈活的格式以便你將正則表達式寫得更易於理解。 |
2.正則表達式模式
下圖列出了Python支持的正則表達式元字元和語法(圖片來自http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html)
3.re模塊
1)re.match函數
re.match 嘗試從字元串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none。
函數語法: re.match(pattern, string, flags=0)
pattern:匹配的正則表達式
string:匹配的字元串
flags:標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。
匹配成功re.match方法返回一個匹配的對象,否則返回None。
start() | 返回匹配開始的位置 |
end() | 返回匹配結束的位置 |
span() | 返回一個元組包含匹配 (開始,結束) 的位置 |
group() | 返回被 RE 匹配的字元串 |
group(num=0) | 匹配的整個表達式的字元串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。 |
groups() | 返回一個包含所有小組字元串的元組,從 1 到 所含的小組號。 |
實例一:
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 ''' 4 # @time : 2017/4/26 20:03 5 # @author : huange 6 # @version : 1.1 7 # @file : test2.py 8 # @Software: PyCharm 9 ''' 10 import re 11 print(re.match('www','www.hh.com').span()) # 在起始位置匹配 12 print(re.match('com','www.hh.com')) # 不在起始位置匹配 13 14 15 結果: 16 (0,3) 17 None
實例二:
1 #!/usr/bin/python3 2 import re 3 4 line = "Cats are smarter than dogs" 5 6 obj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I) 7 8 if obj: 9 print ("obj.group() : ", obj.group()) 10 print ("obj.group(1) : ", obj.group(1)) 11 print ("obj.group(2) : ", obj.group(2)) 12 print(obj.start()) 13 print(obj.end()) 14 print(obj.groups()) 15 else: 16 print ("No match!!") 17 18 19 結果: 20 obj.group() : Cats are smarter than dogs 21 obj.group(1) : Cats 22 obj.group(2) : smarter 23 0 24 26 25 ('Cats', 'smarter')
2)re.search函數
re.search掃描整個字元串並返回第一個成功的匹配
函數語法: re.match(pattern,string, flags=0)
pattern:匹配的正則表達式
string:匹配的字元串
flags:標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等。
匹配成功re.search方法返回一個匹配的對象,否則返回None。
實例一:
1 import re 2 print(re.search('www','www.hh.com').span()) 3 print(re.search('com','www.hh.com').span()) 4 5 結果: 6 (0,3) 7 (7,10)
實例二:
1 #!/usr/bin/python3 2 import re 3 4 line = "Cats are smarter than dogs" 5 6 obj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I) 7 8 if obj: 9 print ("obj.group() : ", obj.group()) 10 print ("obj.group(1) : ", obj.group(1)) 11 print ("obj.group(2) : ", obj.group(2)) 12 print(obj.start()) 13 print(obj.end()) 14 print(obj.groups()) 15 else: 16 print ("No match!!") 17 18 19 結果: 20 obj.group() : Cats are smarter than dogs 21 obj.group(1) : Cats 22 obj.group(2) : smarter 23 0 24 26 25 ('Cats', 'smarter')
PS:re.match只匹配字元串的開始,如果字元串開始不符合正則表達式,則匹配失敗,函數返回None; re.search匹配整個字元串,直到找到一個匹配。
3)re.sub函數
re.sub用於替換字元串中匹配到的選項
函數語法:re.sub(pattern, repl, string, count=0)
pattern : 正則中的模式字元串。
repl : 替換的字元串,也可為一個函數。
string : 要被查找替換的原始字元串。
count : 模式匹配後替換的最大次數,預設 0 表示替換所有的匹配。
實例一:
1 #!/usr/bin/python3 2 import re 3 phone = '135-4238-5642 # 電話號碼' 4 5 # 刪除註釋 6 num = re.sub('#.*$','',phone) 7 print(num) 8 9 # 刪除非字元 10 num = re.sub('\D','',phone) 11 print(num) 12 13 結果: 14 135-4238-5642 15 13542385642
實例二:
1 #!/usr/bin/python 2 3 import re 4 5 # 將匹配的數字乘於 2 6 def double(matched): 7 value = int(matched.group('value')) 8 return str(value * 2) 9 10 s = 'A23G4HFD567' 11 print(re.sub('(?P<value>\d+)', double, s)) 12 13 結果為: 14 A46G8HFD1134
4)re.split函數
函數語法:re.split(pattern,string,maxsplit)
按照能夠匹配的子串將string分割後返回列表。maxsplit用於指定最大分割次數,不指定將全部分割。
1 import re 2 3 p = re.split(r'\d+','one1two2three3four4') 4 print(p)
結果:
['one','two','three','four','']
5)re.findall函數
以列表的形式返回能全部匹配到的子串
函數語法:re.findall(pattern, string ,flags):
1 import re 2 3 p = re.findall(r'\d+','one1two2three3four4') 4 print(p) 5 6 結果: 7 ['1','2','3','4']