正則表達式

正則表達式:

  正則表達式在線測試網址:https://0x9.me/dGRPQ正則表達式

  正則表達式手冊:https://0x9.me/wvkrD算法

正則表達式經常使用場景:

  1.判斷某一個字符串是否符合規則    例(註冊網頁  判斷手機號,身份證是否合法)函數

  2.將符合規則的內容從一個龐大的字符串體系當中提取出來。 例(爬蟲,日誌分析)測試

什麼是正則表達式: 只和字符串打交道

  是一種規則,用來約束字符串的規則spa

字符含義:

# \w \W
# print(re.findall("\w","fsjdk1A")) #['f', 's', 'j', 'd', 'k', '1', 'A']
# print(re.findall('\W','hello egon 123')) #[' ', ' ']
#\s  \S
# print(re.findall('\s','hello  egon  123')) #\s表示全部的空格換行和tab鍵
# print(re.findall('\S','hell*o  egon  123'))  #\S非空格
#\A與^  \Z與$   同樣
# print(re.findall('\Ahe','hello egon 123')) #['he'],\A==>^
# print(re.findall('123\Z','hello egon 123')) #['he'],\Z==>$
# print(re.findall('^h','hello egon 123')) #['h']
# print(re.findall('3$','hello egon 123')) #['3']
# #\b
# l1 = "sing 1studings tuding1 swimming"
# ret = re.findall(r"\b[a-zA-Z]*ing[a-zA-Z]*\b",l1)
# print(ret)      #['sing', 'studings', 'tuding', 'swimming']

#重複匹配
#.  除了換行符以外的任意字符
# print(re.findall("a.b","fsavbfsjajbfa b"))  #['avb', 'ajb', 'a#b']
# 九、1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
# 1)從上面算式中匹配出最內層小括號以及小括號內的表達式
# import re
# l1 = "1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))"
# print(re.findall(r'\([^()]+\)',l1))

 

量詞:

^以什麼開頭    $以什麼結尾

運用

#第一題:一、匹配整數或者小數(包括正數和負數)
# import re
# def func(str1):
#     ret = re.findall("-?\d+(?:\.\d+)?",str1)
#     return ret
# print(func("afdkj123.21afkj-23fafs53.324"))
#第二題:
#二、匹配年月日日期 格式2018-12-06
# import re
# ret =re.findall("\d{4}-[1]?\d-[1-3]?\d","2018-05-6")
# print(ret)
#第三題:
#三、匹配qq號
# import re
# ret = re.findall("[1-9]\d{4,10}","54654444")
# print(ret)
#第四題:
# 四、11位的電話號碼
# import re
# ret = re.findall("^[1][3-8]\d{9}$","18323978615")
# print(ret)
#第五題:
# 五、長度爲8-10位的用戶密碼 : 包含數字字母下劃線
# import re
# ret = re.findall("(?:\d|[a-zA-Z]|_){8,10}","aAk123_5fs")
#
# ret = re.findall("\w{8,10}","asflj123lk")
# print(ret)
#第六題:
# 六、匹配驗證碼:4位數字字母組成的
# import re
# ret = re.findall("(?:\d|[a-zA-Z]){4}","afhz")
# print(ret)
#第七題:
# 七、匹配郵箱地址
# import re
# ret = re.findall("^[a-zA-Z]\w{4,16}(?:\d|[a-zA-Z])@(?:163|126|yeah)\.com$","asf123@163.com")
# print(ret)
#第八題:
# 八、從相似
# <a>wahaha</a>
# <b>banana</b>
# <h1>qqxing</h1>
# 這樣的字符串中,
# 1)匹配出wahaha,banana,qqxing內容。
# 2)匹配出a,b,h1這樣的內容
# import re
# ret = re.search("<(\w+)>([a-zA-Z]+)</(\w+)>","<asf>asfkj</asfd>")
# #第一問
# l1 = ret.group(2)
# print(l1)
# #第二問
# l2 = ret.group(1)
# print(l2)
#第九題
# 九、1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
# 1)從上面算式中匹配出最內層小括號以及小括號內的表達式
# import re
# l1 = "1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))"
# print(re.findall(r'\([^()]+\)',l1))

# #第十題:
# 十、從相似9-2*5/3+7/3*99/4*2998+10*568/14的表達式中匹配出從左到右第一個乘法或除法
import re
# str1 = "9-2*5/3+7/3*99/4*2998+10*568/14"
# l1 = re.search("\d+(\.\d)?(?:\*|\/)\d+(\.\d)?","9-2*5/3+7/3*99/4*2998+10*568/14")
# print(l1.group())

貪婪匹配:正則會盡可能的幫咱們匹配

  默認貪婪,回溯算法3d

非貪婪匹配:會盡可能少爲咱們匹配

  量詞? 表示非貪婪,惰性匹配日誌

  .*?x  表示匹配任意長度的字符遇到x就中止code

*? 重複任意次,但儘量少重複
+? 重複1次或更屢次,但儘量少重複
?? 重複0次或1次,但儘量少重複
{n,m}? 重複n到m次,但儘量少重複
{n,}? 重複n次以上,但儘量少重複

re 模塊下的經常使用方法

import re

ret = re.findall('a', 'eva egon yuan')  # 返回全部知足匹配條件的結果,放在列表裏
print(ret) #結果 : ['a', 'a']

ret = re.search('a', 'eva egon yuan').group()
print(ret) #結果 : 'a'
# 函數會在字符串內查找模式匹配,只到找到第一個匹配而後返回一個包含匹配信息的對象,該對象能夠
# 經過調用group()方法獲得匹配的字符串,若是字符串沒有匹配,則返回None。

ret = re.match('a', 'abc').group()  # 同search,不過盡在字符串開始處進行匹配
print(ret)
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息