#-------------------------正規表示式----------------------------------#
#正規表示式(regular expression)描述了一種字串匹配的模式(pattern),
#它的設計思想是用一種描述性的語言來給字串定義乙個規則,
#凡是符合規則的字串,我們就認為它「匹配」了,否則,該字串就是不合法的。
#可以用來檢查乙個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。
#----------------------------規則-----------------------------------#
#(1)直接給出字元,就是精確匹配
#(2)\d可以匹配乙個數字 '00\d'可以匹配'007' '\d\d\d'可以匹配'010'
#(3)\w可以匹配乙個字母或數字 '\w\w\d'可以匹配'py3'
#(4).可以匹配任意字元 'py.'可以匹配'pyc'、'pyo'、'py!'等等
#(5)\s可以匹配乙個空格(也包括tab等空白符)
#(6)要匹配變長的字元,用*表示任意個字元(包括0個),用+表示至少乙個字元,用?表示0個或1個字元, \s+表示至少有乙個空格
#(7)用表示n個字元,用表示n-m個字元 \d表示匹配3個數字 \d表示3-8個數字,例如'1234567'
#(8)特殊字元,在正規表示式中,要用'\'轉義 \-匹配'-'
#(9)要做更精確地匹配,可以用表示範圍
# [0-9a-za-z\_]可以匹配乙個數字、字母或者下劃線;
# [0-9a-za-z\_]+可以匹配至少由乙個數字、字母或者下劃線組成的字串,比如'a100','0_z','py3000'等等;
# [a-za-z\_][0-9a-za-z\_]*可以匹配由字母或下劃線開頭,後接任意個由乙個數字、字母或者下劃線組成的字串,也就是python合法的變數;
# [a-za-z\_][0-9a-za-z\_]更精確地限制了變數的長度是1-20個字元(前面1個字元+後面最多19個字元)。
#(10)a|b可以匹配a或b (p|p)ython可以匹配'python'或者'python'
#(11)^表示行的開頭,^\d表示必須以數字開頭。
#(12)$表示行的結束,\d$表示必須以數字結束。
#----------------------python中的正規表示式-------------------------#
#注意:使用python的r字首,就不用考慮轉義的問題
import re #re模組,包含所有正規表示式的功能
print(re.match(r'^\d\-\d$','010-123456'))
#匹配,返回match物件:<_sre.sre_match object; span=(0, 10), match='010-123456'>
print(re.match(r'^\d\-\d$','010 123456')) #不匹配,返回none
#切分字串
print(re.split(r'\s+','a b c')) #['a', 'b', 'c']
print( re.split(r'[\s\,]+', 'a,b, c d')) #['a', 'b', 'c', 'd']
print(re.split(r'[\s\,\;]+', 'a,b;; c d,; e')) #['a', 'b', 'c', 'd', 'e']
#分組,提取子串 用()表示的就是要提取的分組(group)
#group(0)永遠是原始字串,group(1)、group(2)……表示第1、2、……個子串
m=re.match(r'^(\d)-(\d)$','123-4567890')
print(m)
print(m.group(0),m.group(1),m.group(2)) #123-4567890 123 4567890
#識別合法的時間
t = '19:05:30'
m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)
#0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9] 表示 00-09|10-19|20-29|30-39|40-49|50-59|0-9
#貪婪匹配 正則匹配預設是貪婪匹配,也就是匹配盡可能多的字元
print(re.match(r'^(\d+)(0*)$', '102300').groups()) #('102300', '')
#由於\d+採用貪婪匹配,直接把後面的0全部匹配了,結果0*只能匹配空字串了
#必須讓\d+採用非貪婪匹配(也就是盡可能少匹配),才能把後面的0匹配出來,加個?就可以讓\d+採用非貪婪匹配
print( re.match(r'^(\d+?)(0*)$', '102300').groups()) #('1023', '00')
#編譯#我們在python中使用正規表示式時,re模組內部會幹兩件事情:
#編譯正規表示式,如果正規表示式的字串本身不合法,會報錯;
#用編譯後的正規表示式去匹配字串。
#如果乙個正規表示式要重複使用幾千次,出於效率的考慮,我們可以預編譯該正規表示式,接下來重複使用時就不需要編譯這個步驟了,直接匹配
re_telephone = re.compile(r'^(\d)-(\d)$')
print( re_telephone.match('010-12345').groups()) #('010', '12345')
print(re_telephone.match('010-8086').groups()) #('010', '8086')
#email位址的正規表示式
re_email=re.compile(r'([a-za-z0-9][a-za-z0-9\.]+)\@(\w+)(\.com)')
str2='[email protected]'
#('someone', 'gmail', '.com')
str1='[email protected]'
#('bill.gates', 'microsoft', '.com')
if re_email.match(str1) is
notnone:
print(re_email.match(str1).groups())
else:
print('not match!')
re_email2=re.compile(r'(\<[0-9a-za-z\s]+\>\s+[0-9a-za-z\.]+)\@(\w+)(\.\w+)')
str3='[email protected]'
#('tom', 'voyager', '.org')
if re_email2.match(str3) is
notnone:
print(re_email2.match(str3).groups())
else:
print('not match!')
python正規表示式元字元 正規表示式
字元 描述將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了 regexp 物件的 multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束...
Python 正規表示式
1.在python中,所有和正規表示式相關的功能都包含在re模組中。2.字元 表示 字串的末尾 如 road 則表示 只有當 road 出現在乙個字串的尾部時才會匹配。3.字元 表示 字元中的開始 如 road 則表示 只有當 road 出現在乙個字串的頭部時才會匹配。4.利用re.sub函式對字串...
Python正規表示式
學習python自然而然就不得不面對正規表示式這個難題。當初在沒有學習python之前,自己也曾經嘗試著學習過正規表示式,但是那時候感覺很麻煩,很難懂,結果就是不了了之。但是現在學習python我用的書是 python基礎教程 第二版 這本書中對re模組的講解很簡單易懂,內容不多但起碼把人領進門了,...