1. 程式人生 > >正則表示式簡略筆記

正則表示式簡略筆記

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

一些表示式示例:  

數字: ^[0-9]*$
n位的數字: ^\d{n}$
至少n位的數字: ^\d{n,}$
m-n位的數字: ^\d{m,n}$
零和非零開頭的數字: ^(0|[1-9][0-9]*)$
非零開頭的最多帶兩位小數的數字: ^([1-9][0-9]*)+(.[0-9]{1,2})?$
帶1-2位小數的正數或負數: ^(\-)?\d+(\.\d{1,2})?$
正數、負數、和小數: ^(\-|\+)?\d+(\.\d+)?$
有兩位小數的正實數: ^[0-9]+(.[0-9]{2})?$
有1~3位小數的正實數: ^[0-9]+(.[0-9]{1,3})?$
非零的正整數: ^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
非零的負整數: ^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
非負整數: ^\d+$ 或 ^[1-9]\d*|0$
非正整數: ^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
非負浮點數: ^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
非正浮點數: ^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
正浮點數: ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
負浮點數: ^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
浮點數:  ^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
英文和數字: ^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
長度為3-20的所有字元: ^.{3,20}$
由26個英文字母組成的字串: ^[A-Za-z]+$
由26個小寫英文字母組成的字串: ^[a-z]+$
由數字和26個英文字母組成的字串: ^[A-Za-z0-9]+$
由數字、26個英文字母或者下劃線組成的字串: ^\w+$ 或 ^\w{3,20}$
中文、英文、數字包括下劃線: ^[\u4E00-\u9FA5A-Za-z0-9_]+$
中文、英文、數字但不包括下劃線等符號: ^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
可以輸入含有^%&',;=?$\"等字元: [^%&',;=?$\x22]+
禁止輸入含有~的字元: [^~\x22]+
Email地址: ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
域名: [a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
InternetURL: [a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
手機號碼: ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
國內電話號碼(0511-4405222、021-87888822): \d{3}-\d{8}|\d{4}-\d{7}
身份證號(15位、18位數字): ^\d{15}|\d{18}$
短身份證號碼(數字、字母x結尾): ^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
帳號是否合法(字母開頭,允許5-16位元組,允許字母數字下劃線): ^[a-zA-Z][a-zA-Z0-9_]{4,15}$
密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線): ^[a-zA-Z]\w{5,17}$
強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字元,長度在8-10之間): ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
日期格式: ^\d{4}-\d{1,2}-\d{1,2}
一年的12個月(01~09和1~12): ^(0?[1-9]|1[0-2])$
一個月的31天(01~09和1~31): ^((0?[1-9])|((1|2)[0-9])|30|31)$
xml檔案: ^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
中文字元的正則表示式: [\u4e00-\u9fa5]
雙位元組字元: [^\x00-\xff] 
空白行的正則表示式: \n\s*\r (可以用來刪除空白行)
HTML標記的正則表示式: <(\S*?)[^>]*>.*?</\1>|<.*? />
首尾空白字元的正則表示式: ^\s*|\s*$或(^\s*)|(\s*$) 
騰訊QQ號: [1-9][0-9]{4,} (騰訊QQ號從10000開始)
中國郵政編碼:[1-9]\d{5}(?!\d) (中國郵政編碼為6位數字)
IP地址: \d+\.\d+\.\d+\.\d+ (提取IP地址時有用)
IP地址: ((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))