1.正則表達式
# 在線正則網站測試
# 雞哥網站py基礎-re模塊-
'''
re模塊與正則表達式之間的關係
正則表達式不是python獨有的 它是一門獨立的技術
全部的編程語言均可以使用正則
可是若是你想在python中使用,你就必須依賴於re模塊python
正則就是用來篩選字符串中的特定的內容的正則表達式
書:正則指引編程
正則的應用場景
1.爬蟲
2.數據分析編程語言
只要是reg...通常狀況下都是跟正則有關測試
1.想匹配具體的內容 能夠直接寫完整的內容,不須要寫正則 # 如 hello網站
'''對象
'''
注意事項blog
字符組 [] [a-z] [A-Z]
一個字符串裏面的表達式都是或的關係
[A-Za-z] # A-Z或a-z字符串
字符
\s \d \w \W \D \S ^ $ \b . ()
^與$符連用 會精準限制匹配的內容 # ^tom$ 匹配一個tom就沒有了
二者中間寫什麼 匹配的字符串就必須是什麼
多一個也不想少一個也不行數據分析
abc|ab 必定要將長的放在前面 # 遵循前長後短
ab|abc # 這種錯誤的狀況只會匹配ab
^ 直接寫在外面 限制字符串的開頭 # 用法一
[^] 除了[]寫的字符 其餘都要 # 用法二
#?用法一
正則在匹配的時候默認都是貪婪匹配(儘可能匹配多的)
你能夠經過在量詞後面加上一個?就能夠將貪婪匹配變成非貪婪匹配(惰性匹配) # ?有兩種用法
量詞
* + ? {n} {n,} {n,m} # ?用法二
量詞必須跟在正則符號的後面
量詞只能可以限制緊挨着它的那一個正則符號 # 即只對前一個目標有效但可利用()讓單體變羣體
分組:當多個正則符號須要重複屢次的時候或者當作一個總體進行其餘操做,那麼能夠分組的形式
分組在正則的語法中就是()
練習
身份證號碼是一個長度爲15或18個字符的字符串,若是是15位則所有🈶️數字組成,
首位不能爲0;若是是18位,則前17位所有是數字,末位多是數字或x,
下面咱們嘗試用正則來表示:
"""
2.re模塊
import re
"""
findall
search
match
"""
# res = re.findall('[a-z]+','eva egon jason')
# # findall('正則表達式','帶匹配的字符串')
# print(res)
# 找出字符串中符合正則表達式所有內容 而且返回的是一個列表,列表中的元素就是正則匹配到的結果
# res = re.search('a','eva egon jason')
# print(res) # search不會給你直接返回匹配到的結果 而是給你返回一個對象
# print(res.group()) # 必須調用group才能看到匹配到的結果
"""
注意:
1.search只會依據正則查一次 只要查到告終果 就不會再日後查找
2.當查找的結果不存在的狀況下 調用group直接報錯
"""
# res1 = re.search('a','eva egon jason')
# # search('正則表達式','帶匹配的字符串')
# if res1:
# print(res1.group())
# res = re.match('a','eva egon jason')
# print(res)
# print(res.group())
"""
注意:
1.match只會匹配字符串的開頭部分
2.當字符串的開頭不符合匹配規則的狀況下 返回的也是None 調用group也會報錯
"""
# ret = re.split('[ab]', 'abcd') # 先按'a'分割獲得''和'bcd',在對''和'bcd'分別按'b'分割
# print(ret) # ['', '', 'cd'] 返回的仍是列表
# ret = re.sub('\d', 'H', 'eva3egon4yuan4',1) # 將數字替換成'H',參數1表示只替換1個
# # sub('正則表達式','新的內容','待替換的字符串',n)
# """
# 先按照正則表達式查找全部符合該表達式的內容 統一替換成'新的內容' 還能夠經過n來控制替換的個數
# """
# print(ret) # evaHegon4yuan4
# ret = re.subn('\d', 'H', 'eva3egon4yuan4') # 將數字替換成'H',返回元組(替換的結果,替換了多少次)
# ret1 = re.subn('\d', 'H', 'eva3egon4yuan4',1) # 將數字替換成'H',返回元組(替換的結果,替換了多少次)
# print(ret) # 返回的是一個元組 元組的第二個元素表明的是替換的個數
# obj = re.compile('\d{3}') #將正則表達式編譯成爲一個 正則表達式對象,規則要匹配的是3個數字
# ret = obj.search('abc123eeee') #正則表達式對象調用search,參數爲待匹配的字符串
# res1 = obj.findall('347982734729349827384')
# print(ret.group()) #結果 : 123
# print(res1) #結果 : ['347', '982', '734', '729', '349', '827', '384']
# import re
# ret = re.finditer('\d', 'ds3sy4784a') #finditer返回一個存放匹配結果的迭代器
# print(ret) # <callable_iterator object at 0x10195f940>
# print(next(ret).group()) # 等價於ret.__next__()
# print(next(ret).group()) # 等價於ret.__next__()
# print(next(ret).group()) # 等價於ret.__next__()
# print(next(ret).group()) # 等價於ret.__next__()
# print(next(ret).group()) # 等價於ret.__next__()
# print(next(ret).group()) # 等價於ret.__next__() 查出迭代取值的範圍 直接報錯
# print(next(ret).group()) #查看第一個結果
# print(next(ret).group()) #查看第二個結果
# print([i.group() for i in ret]) #查看剩餘的左右結果
import re
# res = re.search('^[1-9](\d{14})(\d{2}[0-9x])?$','110105199812067023')
# 還能夠給某一個正則表達式起別名
# res = re.search('^[1-9](?P<password>\d{14})(?P<username>\d{2}[0-9x])?$','110105199812067023')
# print(res.group())
# print(res.group('password'))
# print(res.group(1))
# print(res.group('username'))
# print(res.group(2))
# print(res.group(2))
# print(res.group(1))
# ret1 = re.findall('www.(baidu|oldboy).com', 'www.oldboy.com')
# ret2 = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com') # 忽略分組優先的機制
# print(ret1,ret2) # ['oldboy'] 這是由於findall會優先把匹配結果組裏內容返回,若是想要匹配結果,取消權限便可
# ret=re.split("\d+","eva3egon4yuan")# print(ret) #結果 : ['eva', 'egon', 'yuan']## ret1=re.split("(\d+)","eva3egon4yuan")# print(ret1) #結果 : ['eva', '3', 'egon', '4', 'yuan']