說明:之前提到正則表達式就頭大,每次也都是看個開頭就不看了,堅持不下去,這次終於完整地看完一次文檔,加上之前多多少少看過的,對正則表達式算是有了整體的瞭解。這次筆記主要結合一培訓班的課件,以Python的re模塊爲主。
簡略筆記:
1,正則表達式(Regular Expression),正則表達式使⽤單個字符串來描述、匹配⼀系列匹配某個句法規則的字符串。簡單說就是,這是一個規則,它體現爲一個字符串,可以提取出符合規則的內容。
2,用途:篩選,查找,匹配。
3,學習方法:以我自己的經驗來看,只是簡單的看規則簡直難受,還是覺得結合實例,一邊練習一邊記憶比較好,然後就是多練習練習可以達到很好的效果。
4,Python的正則表達式模塊:Re,match⽅法進⾏匹配操作,group⽅法來提取數據
字符:
例子:
import re
ret = re.match('.', 'a')
ret.group() # 'a'
ret = re.match(".","b")
ret.group() # 'b'
ret = re.match(".","M")
ret.group() # 'M'
# 如果hello的⾸字符⼩寫,那麼正則表達式需要⼩寫的h
ret = re.match("h","hello Python")
ret.group() # 'h'
# 如果hello的⾸字符⼤寫,那麼正則表達式需要⼤寫的H
ret = re.match("H","Hello Python")
ret.group() # 'H'
# ⼤⼩寫h都可以的情況
ret = re.match("[hH]","hello Python")
ret.group() # 'h'
ret = re.match("[hH]","Hello Python")
ret.group() # 'H'
# 匹配0到9第⼀種寫法
ret = re.match("[0123456789]","7Hello Python")
ret.group() # '7'
# 匹配0到9第⼆種寫法
ret = re.match("[0-9]","7Hello Python")
ret.group() # '7'
# 普通的匹配⽅式
ret = re.match("S1季中賽","S1季中賽冠軍")
print ret.group() # S1季中賽
ret = re.match("S2季中賽","S2季中賽冠軍")
print ret.group() # S2季中賽
ret = re.match("S3季中賽","S3季中賽冠軍")
print ret.group() # S3季中賽
# 使⽤\d進⾏匹配
ret = re.match("S1季中賽","S1季中賽冠軍")
print ret.group() # S1季中賽
原始字符串:
正則表達式⾥使⽤"\"作爲轉義字符,假如你需要匹配⽂本中的字符"\",那麼使⽤編程語⾔表示的正則表達式⾥將需要4個反斜槓"\\":前兩個和後兩個分別⽤於在編程語⾔⾥轉義成反斜槓,轉換成兩個反斜槓後再在正則表達式⾥轉義成⼀個反斜槓。Python中字符串前面加上r表示原生字符串可以改善這個問題。
例子:
import re
ret = re.match("c:\\\\", "c:\\a\\b\\c").group()
print(ret) # 'c:\\'
ret = re.match(r"c:\\a", "c:\\a\\b\\c").group()
print(ret) # 'c:\a'
# 使用原生字符串
ret = re.match(r"c:\\a", "c:\\a\\b\\c").group()
print(ret) # 'c:\a'
數量:
例子:
import re
ret = re.match("[A-Z][a-z]*","Aabcdef")
ret.group() # 'Aabcdef'
ret = re.match("[a-zA-Z_]+[\w_]*","name1")
ret.group() # 'name1'
ret = re.match("[a-zA-Z_]+[\w_]*","_name")
ret.group() # '_name'
ret = re.match("[1-9]?[0-9]","33")
ret.group() # '33'
ret = re.match("[1-9]?[0-9]","09")
ret.group() # '0'
ret = re.match("[a-zA-Z0-9_]{6}","12a3g45678")
ret.group() # '12a3g4'
ret = re.match("[a-zA-Z0-9_]{8,20}","1abcde23s34455ff66")
ret.group() # '1abcde23s34455ff66'
邊界:
例子:
import re
ret = re.match("[\w]{4,20}@163\.com$", "[email protected]").group()
print(ret) # '[email protected]'
ret = re.match(r".*\bver\b", "ab cde fgh").group()
print(ret) # 'ab cde'
匹配分組:
例子:
import ret
ret = re.match("\w{4,20}@163\.com", "[email protected]")
ret.group()
ret = re.match("\w{4,20}@(163|126|qq)\.com", "[email protected]")
ret.group()
ret = re.match("\w{4,20}@(163|126|qq)\.com", "[email protected]")
ret.group()
ret = re.match("\w{4,20}@(163|126|qq)\.com", "[email protected]")
ret.group()
# "[email protected]"
# "[email protected]"
# "[email protected]"
# AttributeError
# 通過引⽤分組中匹配到的數據即可,但是要注意是元字符串,即類似 r""這種格式
ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", "<html>mm</html>")
ret.group()
# 因爲2對<>中的數據不⼀致,所以沒有匹配出來
ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", "<html>mm</htmlbalabala>")
ret.group()
# "<html>mm</html>"
# AttributeError
ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.python.org</h1></html>")
ret.group()
ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.python.org</h2></html>")
ret.group()
# "<html><h1>www.python.org</h1></html>"
# AttributeError
貪婪和非貪婪:
Python⾥數量詞默認是貪婪的(在少數語⾔⾥也可能是默認⾮貪婪),總是嘗試匹配儘可能多的字符;⾮貪婪則相反,總是嘗試匹配儘可能少的字符。在"*","?","+","{m,n}"後⾯加上?,使貪婪變成⾮貪婪。