Python正規表示式

2021-08-04 08:39:33 字數 3679 閱讀 7299

#-------------------------正規表示式----------------------------------#

#正規表示式(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模組的講解很簡單易懂,內容不多但起碼把人領進門了,...