1. 程式人生 > >Python中正則表示式對單個字元,多個字元,匹配邊界等使用

Python中正則表示式對單個字元,多個字元,匹配邊界等使用

         Regular Expression,正則表示式,又稱正規表示式、正規表示法、正則表示式、規則表示式、常規表示法(英語:Regular Expression,在程式碼中常簡寫為regex、regexp或RE),是電腦科學的一個概念。正則表示式是一個特殊的字元序列,它能幫助你方便的檢查一個字串是否與某種模式匹配。在很多文字編輯器裡,正則表示式通常被用來檢索、替換那些匹配某個模式的文字。

       Python 自1.5版本起增加了re 模組。re 模組使 Python 語言擁有全部的正則表示式功能。

1.re.match函式

   python用re.match函式從字串的起始位置匹配一個模式,若字串匹配正則表示式,則match方法返回匹配物件(Match Object),否則返回None(注意不是空字串"")。匹配物件Macth Object具有group方法,用來返回字串的匹配部分。

   函式語法:re.match(pattern, string, flags) ;pattern是正則表示式,string需要匹配的字串,flags為可選引數修飾符。

# 匯入re模組,注意match函式是從起始位置匹配的。如果起始位置匹配失敗,則返回None
import re
#match()函式適合匹配是否以xxxx開始的字串,因為其從頭開始匹配的
ret = re.match("abc","aBCabc",re.I)  #可選引數re.I表示忽略大小寫,後續詳細解釋。
print(ret.group())  #aBC
ret1 = re.match("abc","aBCabc")
print(ret1.group()) # 'NoneType' object has no attribute 'group'
  
  

2.正則表示式的語法

2.1正則表示式對字元(單個字元)的表示

字元 功能
. 匹配任意1個字元(除了\n),注意因為.表示任意一個字元,所以如果匹配‘.’則需要用轉義字元\.來表示
[ ] 匹配[ ]中列舉的字元,如果[a-zA-Z0-9],[a-zA-Z]表示所有字母和數字,後者表示所有字母,注意中間沒有空格符號。
\d 匹配數字,即0-9
\D 匹配非數字,即不是數字
\s
匹配空白,即 空格,tab鍵
\S 匹配非空白
\w 匹配單詞字元,即a-z、A-Z、0-9、_
\W 匹配非單詞字元
# 匯入re模組
import re
#1.測試.的使用,匹配任意字元開始的字串
str='abc'
ret =re.match("..",str)
print(ret.group())  #ab.用兩個..就表示只要str字串開頭是兩個字元即可。
ret1 = re.match("....",str)  #這種情況則會報錯,因為str只有三個字元。

#2.匹配[]範圍內的任意一個字元開頭的字串
str1 = "abcABC*?//"
str2 = "3afasdlfadsf"
ret2 = re.match("[a-z]",str1).group()  #a
ret3 = re.match("[123456]",str2).group() #3,[1-6]等價[123456]


#3./d的使用,表示匹配任意一個數字
str3 = "第5名是我"
ret4 = re.match("第\d名",str3).group()
print(ret4)  #第5名

ret4 = re.match("第[0-9]名",str3)  #同樣是表示0-9任意一個,[0-9]和\d效果一樣
print(ret4.group())  #第5名

 總結:注意上面對字元的匹配都是表示一個任意字元,或者某個範圍內的任意一個字元,屬於單個字元匹配。而實際開發中肯定都是用一個子串(多個字元)去匹配整個字串。那麼如何表示呢,請繼續下去。

2.2正則表示式匹配多個字元:數量的表示

匹配多個字元的相關格式,其實就是單個字元加上數量。注意下面數量的匹配都是針對前一個字元。

字元 功能
* 匹配前一個字元出現0次或者無限次,即可有可無
+ 匹配前一個字元出現1次或者無限次,即至少有1次
? 匹配前一個字元出現1次或者0次,即要麼有1次,要麼沒有
{m} 匹配前一個字元出現m次
{m,} 匹配前一個字元至少出現m次
{m,n} 匹配前一個字元出現從m到n次
# 匯入re模組
import re

#1.匹配第一個是大寫字母,第二個小寫字母,後面只要是小寫字母即可。
ret = re.match("[A-Z][a-z]*","Aafngsdfgnlsdf1224343")
print(ret.group())  #Aafngsdfgnlsdf
ret1 = re.match("[A-Z][a-z]*","AaAaaa34bbb")
print(ret1.group())  #Aa ,因為後面不是小寫字母所以沒匹配到。

#匹配下面字串是否以字母或者下劃線開頭
ret = re.match("[a-zA-Z_]+[\w_]*","name1") #解釋1:[a-zA-Z_]+字母下劃線至少出現一次
print(ret.group())  #name1

ret = re.match("[a-zA-Z_]+[\w_]*","_name") #解釋2:[\w_]*表示字母,資料下劃線出現任意次
print(ret.group()) #_name

ret = re.match("[a-zA-Z_]+[\w_]*","2_name")
#print(ret.group())  #報錯,因為匹配不上,返回None.


#3.匹配前面字元出現0次或者1次使用?
ret = re.match("[1-9]?[0-9]","7")
print(ret.group())  #7

ret = re.match("[1-9]?[0-9]","33")
print(ret.group()) #33

ret = re.match("[1-9]?[0-9]","09")
print(ret.group())  #0

#4.前面字元出現n此,或者m-n範圍內的任意次
ret = re.match("[a-zA-Z0-9_]{6}","dsa2A9nfdsf")
print(ret.group())  #dsa2A9,匹配前6位是數字字元下劃線即可

ret = re.match("[a-zA-Z0-9_]{3,8}","aSjsd239344")
ret1 = re.match("[a-zA-Z0-9_]{3,8}","aSjs")
print(ret1.group()) #aSjs,注意匹配前一個字元出現3-8次,只要這個範圍內都算匹配成功,按實際匹配
print(ret.group())  #aSjsd239 匹配前一個字元出現3到8次

ret = re.match("[a-z0-9A-Z_]{3,}","a2")
print(ret.group())  #至少出現3次,所以如果只有兩個的話,返回None,呼叫報錯。

總結:單個字元匹配,多個字元匹配上面都已經演示過了,基本可以完成大多數字符串的匹配了。但是上面過於字串的匹配都是從頭開始匹配的,而實際開發中可能是從字串中間,後者結尾開始匹配的。keep reading....

2.3.正則表示式:匹配邊界的問題

字元 功能
^ 匹配字串開頭
$ 匹配字串結尾
\b
匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B 匹配非單詞邊界,'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
# 匯入re模組
import re

# 匹配以@qq.com郵箱結尾的郵箱地址
#1.不適用匹配字串結尾的$來實現,注意.要用轉義字元,一般郵箱的長度都是4-30位
ret = re.match("[\w]{4,30}@qq\.com", "[email protected]")
print(ret.group()) #[email protected]


# 通過$來確定末尾,效率更高
ret = re.match("[\w]{4,30}@qq\.com$", "[email protected]")
print(ret.group()) #[email protected]

ret = re.match("[\w]{4,30}@qq\.com$", "[email protected]")
#print(ret.group()) #報錯