1. 程式人生 > >Python 基礎入門 8_1 正則表達式

Python 基礎入門 8_1 正則表達式

返回 www 復合 整體 開頭 print pat 部分匹配 部分

"""
自1.5版本後,引入re模塊,使python可以寫正則表達式,正則表達式是用來判斷或者返回指定匹配模式的字符串:
比如說:密碼規則需要大小寫字母和數字組成,如果我們輸入字符串來判斷復合密碼規則,需要許多的判斷語句,
而用正則表達式則可以很快的判斷出這個字符串是否符合字符串的要求,減少了代碼的工作量

python正則表達式的實現需要引用 re模塊:import re
re模塊的函數常用的有三個參數:
pattern:編寫規則,用來配對字符串是否符合規則:
pattern = "pa" ,該規則為第一個字符為p,第二個字符的為a的字符串規則
string:要匹配的字符串
flags: 標識符,標誌位,用於控制正則表達式的匹配方式
re.I 忽略大小寫
re.L 做本地戶識別
re.M 多行匹配,影響^和$ ,如果要匹配的字符串為多行,需要賦這個值,不然只會匹配該字符的第一行,其他行不匹配
re.S 是.匹配包括換行符在內的所有字符
re.U 根據Unicode字符集解析字符,影響\W \W \b
re.X 使我們以更靈活的格式理解正則表達式

re.match(pattern,string,[flag]) 函數
功能:從參數string字符串開始位置判斷是否符合pattern規則,是返回一個‘_sre.SRE_Match‘對象,不是返回None
"""
import re
patter1,patter2 = "www","wwW" #patter1 規則第一到第三位為w,patter2的規則從第一到第二為w,第三位為W
string1,string2,string3,string4 = "www.baidu.comwww","ww.baidu.com","wwww.baidu.com","baidu.com www"
print(re.match(patter1,string1)) #返回對象 從string1的起始位置,前三位都為w,與patter1的規則符合
print(re.match(patter1,string2)) #返回 None 從string2的起始位置,前三位為ww. 與patter1的規則不符合
print(re.match(patter1,string3)) #返回對象 從string3的起始位置,前三位都為w,與patter1的規則符合
print(re.match(patter1,string4)) #返回None 從string4的起始位置,前三位為bai,與patter1的規則不符合
print(re.match(patter2,string1)) #返回None 從string1的起始位置,前三位都為w,與patter2(前三位為wwW)的規則不符合
print(re.match(patter2,string1,re.I)) #返回對象 從string1的起始位置,前三位都為w,與patter2(前三位為wwW)的規則不符合,
# 但flag的參數為re.I,這個值是忽略大小寫,即可以將patter2的規則看成www,所以string1符合要求

"""
re.search(pattern,string,[flag]) 函數
功能:從string字符串中判斷是否有包含pattern規則,有返回對象,沒有返回None
"""
patter1,patter2 = "www","wwW"
string1,string2,string3,string4 = "www.baidu.comwww","ww.baidu.com","wwww.baidu.com","baidu.com www"
print("1==============================")
print(re.search(patter1,string1)) #返回對象
print(re.search(patter1,string4)) #返回對象
print(re.search(patter2,string1,re.I)) #返回None

"""
re.findall(pattern,string,[flag]) 函數
功能:從string字符串中是否有包含pattern規則,有則返回能匹配pattern規則字符的列表,沒有返回空列表
(可以知道這字符串可以有多少個匹配pattern規則的)
"""
patter1,patter2 = "www","wwW" 
string1,string2,string3,string4 = "www.baidu.comwww","ww.baidu.com","wwww.baidu.com","baidu.com www"
print("2--------------------------------")
print(re.findall(patter1,string1)) #返回["www","www"]列表
print(re.findall(patter1,string2)) #返回[]列表

R"""
pattern的單字符規則:
. 匹配除換行符以外的任意字符
^ 脫字符,表示不匹配集合的字符,與字符集合搭配
\d 匹配數字,效果同[0-9]
\D 匹配非數字字符,效果同[^0-9]
\w 匹配數字,字母和下劃線,同[0-9a-zA-Z_]
\W 匹配非數字,字母和下劃線,同[^0-9a-zA-Z_]
\s 匹配空白符(空格,換行,回車,換頁,制表),同[ \f\n\r\t]
\S 匹配非空白符,同[~ \f\n\r\t]

[0123456789] []是字符集合,表示匹配括號中所包含的任意一個字符,該字符集合是匹配數字
[a-z] 匹配任意小寫字母
[A-Z] 匹配任意大寫字母
[0-9a-zA-Z_] 匹配任意的數字、字母和下劃線
"""
patter1,patter2 = "www","wwW" 
string1,string2,string3,string4 = "www.baidu.comwww","ww.baidu.com","wwww.baidu.com","baidu.com www"
print("3+++++++++++++++++++++++++")
print(re.search(".",string1)) #返回對象
print(re.search("\d",string1)) #返回None
print(re.search("\w",string1)) #返回對象
print(re.search("\s",string1)) #返回對象
print(re.search("[0-9]",string1)) #返回None

R"""
pattern(正則表達式)的錨字符(即邊界字符)的規則,
^str 行首匹配,和在[]裏的^表示的不一樣
str$ 行尾匹配
\Astr 匹配字符串開始位置 ,與^的區別是,^字符串為多行時,返回每行首匹配,\A是只匹配第一行的開頭
str\Z 匹配字符串結束,與$的區別是,$字符串為多行時,返回每行尾匹配,\Z是只匹配第一行的結尾
str\b 匹配一個單詞的邊界
str\B 匹配一個非單詞的邊界
"""
print("4+++++++++++++++++++++++++")
patter1,patter2 = "www","wwW" 
string1,string2,string3,string4 = "www.baidu.comwww","ww.baidu.com","wwww.baidu.com","baidu.com www"
print(re.search("^www",string3))      #返回對象
print(re.search("^www",string2)) #返回None
print(re.search("com$",string2)) #返回對象

string5 = "www.hjlin.com\nwww.baidu.com"
print(re.findall("^www",string5)) #返回["www"]
print(re.findall("^www",string5,re.M)) #返回["www","www"]
print(re.findall(r"\Awww",string5)) #返回["www"]
print(re.findall(r"\Awww",string5,re.M)) #返回["www"]

print(re.findall("com$",string5)) #返回["com"]
print(re.findall("com$",string5,re.M)) #返回["com","com"]
print(re.findall(r"com\Z",string5)) #返回["com"]
print(re.findall(r"com\Z",string5,re.M)) #返回["com"]

print(re.search(r"er\b","ever")) #返回對象
print(re.search(r"er\b","everst")) #返回None
print(re.search(r"er\B","ever")) #返回對象
print(re.search(r"er\B","everst")) #返回None


R"""
正則表達式 指定多個字符串為規則
str 以str為整體去匹配
str? 以0個或者1個str為整體去匹配
str1|str2 以str1或者str2為整體去匹配

#以下str,只能為單個字符,若str是多個字符組成的字符串,效果會於結果不一致或返回None(空列表)
str* 以多個str為整體去匹配
str+ 以至少一個str為整體去匹配
str{int} 以int個str為整體去匹配
str{int,} 以至少int個str為整體去匹配
str{int,int1} 以至少int個,最多int1個str為整體去匹配
"""
print("5+++++++++++++++++++++++++++++")
print(re.findall("hjl","hjl hjl hjl")) #返回["hjl","hjl","hjl"]
print(re.findall("hjl","h j l h j l h j l")) #返回[]

print(re.findall("hjl?","hjl hjl hjl")) #返回["hjl","hjl","hjl"],因為hjl不為一個字符的字符串,因此導致結果於hjl的規則一致
print(re.findall("hjl?","hjlhjlhjl ")) #返回["hjl","hjl","hjl"],因為hjl不為一個字符的字符串,因此導致結果於hjl的規則一致
print(re.findall("a?","aaa")) #返回["a","a","a",""]
print(re.findall("a","aaa")) #返回["a","a","a"]

print(re.findall("a*","abaabbaaabbbaaaabbbb")) #返回["a","","aa","","","aaa","","","","aaaa","","","",""]
print(re.findall("hjl*","hjlhjlhjl ")) #返回["hjl","hjl","hjl"]

print(re.findall("a+","abaabbaaabbbaaaabbbb")) #返回["a","aa","aaa","aaaa"]
print(re.findall("hjl+","hjlbhjlhjlbbhjlhjlhjlbbbhjlhjlhjlhjlbbbb")) #返回["hjl","hjl","hjl","hjl","hjl","hjl","hjl","hjl","hjl","hjl"]

print(re.findall("a{2}","abaabbaaabbbaaaabbbb")) #返回["aa","aa","aa","aa"]
print(re.findall("hjl{2}","hjlbhjlhjlbbhjlhjlhjlbbbhjlhjlhjlhjlbbbb")) #返回[]
print(re.findall("a{2,}","abaabbaaabbbaaaabbbb")) #返回["aa","aaa","aaa"]
print(re.findall("hjl{2,}","hjlbhjlhjlbbhjlhjlhjlbbbhjlhjlhjlhjlbbbb")) #返回[]
print(re.findall("a{2,3}","abaabbaaabbbaaaabbbb")) #返回["aa","aaa","aaa"]
print(re.findall("hjl{2,3}","hjlbhjlhjlbbhjlhjlhjlbbbhjlhjlhjlhjlbbbb")) #返回[]

print(re.findall("hjl|hjj" , "hjlbhjj")) #返回["hjl","hjj"]
print(re.findall("h|j","hjl")) #返回["h","j"]

str="hjl is a man!hjl is a good man!hjl is a very good man"
print(re.findall(r"hjl.*man",str)) #返回["hjl is a man !hjl is a good man !hjl is a very good man"]
print(re.findall(r"hjl.*?man",str)) #返回["hjl is a man","hjl is a good man","hjl is a very good man"]
#針對上述的兩句正則進行說明:第一個規則為以 開頭前三個為hjl,最後的三個為man,中間是除換行符之外的任意字符,可以有多個
#第二個規則,再第一個規則的基礎上,規定了開頭和中間的部分為一個整體去匹配,即當程序遇到了第二個hjl,後面的內容和中間部分匹配,算第二個整體。

Python 基礎入門 8_1 正則表達式