python就業班----正規表示式及re應用

qq_38572976發表於2020-10-05
"""正規表示式"""

# 1.匯入re模組
# import re
# # 2.使用match方法進行匹配操作
# result=re.match(正規表示式,要匹配的字串)
# # 3.如果上一步匹配到資料的話,可以i使用group方法來提取資料
# result.group()



"""re模組示例(匹配以itcast開頭的語句)"""
# import re
# result=re.match(r"itcast","itcast.cn")
# print(result)   #匹配時有返回值<re.Match object; span=(0, 6), match='itcast'>,否則沒有返回值
# print(result.group())  # 提取資料


"""匹配單個字元"""
# import re
# result=re.match(r"速度與激情1","速度與激情1")
# print(result)
# print(result.group())
#
# # 匹配數字\d,一個\d等於一位數字
# result2=re.match(r"速度與激情\d","速度與激情2")
# print(result2)
# print(result2.group())
#
# result3=re.match(r"速度與激情\d","速度與激情8")
# print(result3)
# print(result3.group())
#
#
# print(re.match(r"速度與激情[12345678]","速度與激情8").group())
# print(re.match(r"速度與激情[12345678]","速度與激情6").group())
# print(re.match(r"速度與激情[1-36-8]","速度與激情6").group())
# print(re.match(r"速度與激情[1-36-8]","速度與激情7").group())
#
# # 匹配數字和字母
# print(re.match(r"速度與激情[1-8abcd]","速度與激情5").group())
# print(re.match(r"速度與激情[1-8abcd]","速度與激情a").group())
# # print(re.match(r"速度與激情[1-8abcd]","速度與激情e").group())  # 不能匹配
# print(re.match(r"速度與激情[1-8a-zA-Z]","速度與激情F").group())
#
# #\w  匹配單詞字元,即a-z,A-Z,0-9,且支援其他的語言-----慎用
# print(re.match(r"速度與激情\w","速度與激情F").group())
# print(re.match(r"速度與激情\w","速度與激情a").group())
# print(re.match(r"速度與激情\w","速度與激情1").group())
# print(re.match(r"速度與激情\w","速度與激情0").group())
#
# #\s   匹配空白s
# print(re.match(r"速度與激情 \d","速度與激情 1").group())
# print(re.match(r"速度與激情\s\d","速度與激情\t1").group())
#
# # \D:匹配非數字
# # \S:匹配非空白
# # \W:匹配非單詞字元
# # .  :匹配任意單個字元
# print(re.match(r"速度與激情.","速度與激情1").group())
# print(re.match(r"速度與激情.","速度與激情a").group())
# print(re.match(r"速度與激情.","速度與激情!").group())


"""匹配多個字元"""
# {m,n}:匹配前一個字元出現從m到n次
import re
# print(re.match(r"速度與激情\d{1,2}","速度與激情12").group())
# print(re.match(r"速度與激情\d{1,2}","速度與激情1").group())  # {}限制位數{1,2}:一位兩位都可以
# print(re.match(r"速度與激情\d{1,3}","速度與激情123").group())  # {1,2,3} :一位兩位三位都可以
# print(re.match(r"速度與激情\d{3}","速度與激情123").group())  # {3} :必須為三位,否則報錯
# # print(re.match(r"速度與激情\d{3}","速度與激情13").group())  # {3} :必須為三位,否則報錯

# ?:匹配前一個字元出現0次或者1次,即要麼0次,要麼1次
# print(re.match(r"021-\d{8}","021-12345678").group())
# print(re.match(r"021-?\d{8}","021-12345678").group())
# print(re.match(r"\d{3,4}-?\d{8}","0186-12345678").group())

# html_content="""fgdhjh
# asdfghjk
# wertyuio
# wertyuio
# werfghuiop'
# sdrtyj uiojhh
# wertyui'
# wqertyui
# yfuio
# thjk"""
# print(html_content)

# . :匹配任意1個字元,除了\n換行之外
# print(re.match(r".*","asd").group())
# print(re.match(r".*","a1").group())
# print(re.match(r".*","").group())
#
# # *:匹配任意多個,可以有也可以沒有
# print(re.match(r".*",html_content).group())
#
# #re.s:讓點.包括/n
# print(re.match(r".*",html_content,re.S).group())

# + :匹配前一個字元出現1次或者無限次,即至少有1次
# print(re.match(r".+","f").group())
# print(re.match(r".+","fty").group())
# print(re.match(r".+","fasdfgh").group())
# # print(re.match(r".+","").group())  #報錯

"""需求:匹配出,變數名是否有效"""
import re
#
# names=["name1","_name","2_name","__name__"]
#
# for name in names:
#     #\w  匹配單詞字元,即a-z,A-Z,0-9,且支援其他的語言
#     ret=re.match("[a-zA-z_]+[\w]*",name)
#     if ret:
#         print("變數名%s符合要求:"%ret.group())
#     else:
#         print("變數名%s非法"%name)



# import re
#
# def main():
#     names=["age","_age","1age","age1","a_age","age_1_","age!","a#123","_____"]
#     for name in names:
#         ret=re.match(r"[a-zA-Z_][a-zA-Z0-9_]*",name) # match可以判斷以誰開頭,不能判斷以誰結尾
#         if ret:
#             print("變數名:%s符合要求,通過正則匹配出來的是%s" %(name,ret.group()))
#         else:
#             print("變數名%s非法" % name)
#
#
#
# if __name__=="__main__":
#     main()
"""  ^:判斷以誰開頭   """
"""判斷結尾:$"""
# import re
#
# def main():
#     names=["age","_age","1age","age1","a_age","age_1_","age!","a#123","_____"]
#     for name in names:
#         # $:判斷結尾
#         ret=re.match(r"^[a-zA-Z_][a-zA-Z0-9_]*$",name)
#         if ret:
#             print("變數名:%s符合要求,通過正則匹配出來的是%s" %(name,ret.group()))
#         else:
#             print("變數名%s非法" % name)
#
#
#
# if __name__=="__main__":
#     main()

"""匹配163郵箱地址"""
# import re
#
# def main():
#     email=input("請輸入一個郵箱地址:")
#     # 如果在正規表示式中用到了某些普通的字元:.?等,僅僅需要在他們前面新增一個反斜槓轉義
#     ret=re.match(r"[a-zA-Z_0-9]{4,20}@163\.com$",email)
#     if ret:
#         print("%s符合要求---"%email)
#     else:
#         print("%s不符合要求---"%email)
#
#
# if __name__=="__main__":
#     main()


"""分組匹配"""
# import re
# 對多種郵箱進行判斷
"""
|:匹配左右任意一個表示式
(ab):將括號中字元作為一個分組
\num:引用分組num匹配到字串
(?P<name>):分組起別名
(?P=name): 引用別名為name分組匹配到的字串
"""
# print(re.match(r"[a-zA-Z_0-9]{4,20}@(163|126|qq|google)\.com$","laowang@163.com").group())
# print(re.match(r"[a-zA-Z_0-9]{4,20}@(163|126)\.com$","laowang@126.com").group())
#
# # 匹配成功後取部分內容:只需新增小括號取括號裡的內容
# print(re.match(r"[a-zA-Z_0-9]{4,20}@(163|126)\.com$","laowang@126.com").group(1))  # 126
# print(re.match(r"([a-zA-Z_0-9]{4,20})@(163|126)\.com$","laowang@126.com").group(1))  # laowang
# print(re.match(r"([a-zA-Z_0-9]{4,20})@(163|126)\.com$","laowang@126.com").group(2))  # 126

# \num:引用分組num匹配到字串
# import re
# html_str="<h1>hahahaha</h1>"
# print(re.match(r"<(\w*)>.*</\1*>",html_str).group())

# html_str="<body><h1>hahhahah</h1></body>"
# print(re.match(r"<(\w*)><(\w*)>.*</\2></\1>",html_str).group())
# print(re.match(r"<(?P<p1>\w*)><(?P<p2>\w*)>.*</(?P=p2)></(?P=p1)>",html_str).group())


"""re模組的高階用法:python自帶的"""
# """1.search:不會從頭匹配,但是一旦匹配一部分到就算匹配到了"""
#需求:匹配文章閱讀次數
# import re
# print(re.search(r"\d+","閱讀的次數為000099999").group())
# print(re.search(r"\d+","閱讀的次數為99999,點贊數為:100").group())


# """2.findall:返回值是一個列表,返回的是資料"""
# 需求:統計出python、c、c++相應文章的閱讀次數
# import re
#
# ret=re.findall("\d+","python=9999,c=7890,c++=12345")
# print(ret)   #['9999', '7890', '12345']

# """3.sub將匹配到的資料進行替換"""
# import re
# print(re.sub(r"\d+",'998',"python=997"))  # python=998
# print(re.sub(r"\d+",'998',"python=997,c++=1024"))  # python=998,c++=998
"""sub支援函式的呼叫"""
# import re
#
# def add(temp):
#     strNum=temp.group()
#     num=int(strNum)+1
#     return str(num)
#
# print(re.sub(r"\d+",add,'python=997'))  # python=998
#
# print(re.sub(r"\d+",add,'python=99'))  # python=100

"""split根據匹配進行切割字串,並返回一個列表"""
import re
print(re.split(r":| ","info:xiaoming 33 shandong"))  # ['info', 'xiaoming', '33', 'shandong']

相關文章