正則表達式簡略筆記

說明:之前提到正則表達式就頭大,每次也都是看個開頭就不看了,堅持不下去,這次終於完整地看完一次文檔,加上之前多多少少看過的,對正則表達式算是有了整體的瞭解。這次筆記主要結合一培訓班的課件,以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}"後⾯加上?,使貪婪變成⾮貪婪。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章