python之re模块collections模块
生活随笔
收集整理的這篇文章主要介紹了
python之re模块collections模块
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正則
# re模塊和正則表達式 re模塊本質上和正則表達式沒有一毛錢的關系 # 正則表達式不僅在python領域,在整個編程屆都占有舉足輕重的地位。 # 正則表達式本身也和python沒有什么關系,就是匹配字符串內容的一種規則。 # 官方定義:正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”, # 這個“規則字符串”用來表達對字符串的一種過濾邏輯。字符組 元字符
# 字符組 : [字符組] # 在同一個位置可能出現的各種字符組成了一個字符組,在正則表達式中用[]表示 # [0-9] [a-z] [A-Z] [0-9a-fA-F] # 元字符 都是代表匹配一個 # . 匹配除換行符以外的任意字符 # \w 匹配字母或數字或下劃線 # \s 匹配任意的空白符 # \d 匹配數字 # \n 匹配一個換行符 # \t 匹配一個制表符 # ^ 匹配字符串的開始 # $ 匹配字符串的結尾 # \W匹配非字母或數字或下劃線 # \D匹配非數字 # \S匹配非空白符 # a| b匹配字符a或字符b # ()分組 匹配括號內的表達式,也表示一個組 列www\.(baidu|jd|taobao)\.com # [...] 匹配字符組中的字符 列[\d\D]匹配所有 [\d\n] 一個[]代表一個字符 # [ ^ ...] 匹配除了字符組中字符的所有字符 列 [^1] 除了1的所有 一個[]代表一個字符量詞
# 量詞 # * 重復零次或更多次 # + 重復一次或更多次 貪婪 # ? 重復零次或一次 # {n} 重復n次 列\d{2} 只可以匹配2個 # {n,} 重復n次或更多次 列\d{2,} 只可以匹配2個以上 # {n,m} 重復n到m次 # 特殊的符號 # . 匹配除了換行符之外的所有 # ^ 尖角號 在字符組中[^]代表非 在外面代表匹配一一個字符串的開始 列 ^a 以a開頭 # $ 代表匹配一一個字符串的結尾 列 ^a 以a結尾貪婪匹配與非貪婪
# 貪婪匹配:在滿足匹配時,匹配盡可能長的字符串,默認情況下,采用貪婪匹配 # .* .*? # 幾個常用的非貪婪匹配Pattern # *? 重復任意次,但盡可能少重復 # +? 重復1次或更多次,但盡可能少重復 # ?? 重復0次或1次,但盡可能少重復 # {n,m}? 重復n到m次,但盡可能少重復 只可以匹配n到m個 # {n,}? 重復n次以上,但盡可能少重復# . 是任意字符 # * 是取 0 至 無限長度 # ? 是非貪婪模式。 # 何在一起就是 取盡量少的任意字符,一般不會這么單獨寫,他大多用在: # .*?x # 就是取前面任意長度的字符,直到一個x出現轉義符
# 轉義符問題# . 有特殊的意義,取消特殊的意義\.# 取消一個元字符的特殊意義有兩種方法# 在這個元字符前面加\# 對一部分字符生效,把這個元字符放在字符組里# [.()+?*]re模塊
findall search
import re # findall 利用re模塊可以解決的問題在不規則字符串中利用正則匹配出想要得到結果 返回列表 取所有符合條件的,優先顯示分組中的#元祖形式 一個()代表元祖中一個內容 # search 顯示匹配到的第一個內容 對象應該是 利用group()獲得數字 只取第一個符合條件的,沒有優先顯示這件事兒# 變量.group() 的結果 完全和 變量.group(0)的結果一致# 變量.group(n) 的形式來指定獲取第n個分組中匹配到的內容 假如我優先分組了2個我取3個就報錯# 為什么在 search 中不需要分組優先 而在findall中需要?# 如果沒有分組優先 我們想要取到想要的內容就要fro循環 和切片麻煩 (加上括號 是為了對真正需要的內容進行提取) # 加上括號 是為了對真正需要的內容進行提取 # 如何取消分組優先# 如果在寫正則的時候由于不得已的原因 導致不要的內容也得寫在分組里# (?:) 取消這個分組的優先顯示 # 加上括號 是為了對真正需要的內容進行提取 ret = re.findall('<\w+>(\w+)</\w+>','<h1>111</h1><h1>2222</h1>') print(ret)#['111', '2222']# search ret = re.search('<(\w+)>(\w+)</\w+>','<h1>111</h1><h1>2222</h1>') print(ret)#<re.Match object; span=(0, 12), match='<h1>111</h1>'> 變量 print(ret.group())#<h1>111</h1> print(ret.group(1))#z1 print(ret.group(2))#111 print(ret.group(3))#會報錯 為什么 優先分組了2個 我取3個當然報錯re其他方法
import re # re方法 # findall()優先分組全部返回 serch()優先分組第一個 split() sub() subn() match() compile() finditer() # split其實就是把匹配出來的字符串切了,帶括號的保留,(括號必須在字符串里面)返回列表 # ret = re.split('\d+','alex222wusir')#將匹配出來的222切掉但加了括號就保留了 變成列表['alex', '123', 'wusir'] # ret = re.split('(\d\d\d)','alex123wusir')#將匹配出來的222切掉,但是保留分組優先['alex', '2', 'wusir'] # ret = re.split('\d(\d)\d','alex123wusir')#將匹配出來的222切掉,但是保留分組優先['alex', '2', 'wusir'] # sub 替換 # ret = re.sub('\d+','H','alex123wusir456',1)#將匹配出來的字符串進行替換,第3個參數是替換前幾個 # ret = re.sub('\d+','H','alex123wusir456')#alexHwusirH # subn # ret = re.subn('\d+','H','alex123wusir456')#返回元祖 不僅替換還告訴你替換的次數('alexHwusirH', 2) # match 想當與加了一個尖角好 和group()一樣 一般用作用戶輸入 # ret = re.match('\d+','123eva456taibai')#<re.Match object; span=(0, 3), match='123'> # ret = re.match('\d+','eva456taibai')#None 結果為什么是none 他相當與人為加了一個尖角號 之會匹配開頭第一個 # ret = re.search('^\d+','123eva456taibai')#與上面效果相同 # print(ret.group()) # 為什么^group() 和match()效果一樣 但我們還有用他?# 雖然效果相同都是找匹配出來的第一個但是match是規定這個字符號必須是什么樣的# 而group是用來尋找這個字符串中是不是含有滿足條件的子內容 態度不同# 用match我們可以用作用戶輸入時判斷他輸入的內容是不是和我的正則匹配# match('手機號正則$','123eva456taibai') # compile -- 節省代碼時間的工具 可以與其他方法相結合 提高了效率# 假如同一個正則表達式要被使用多次(爬蟲時)# 節省了多次解析同一個正則表達式的時間 # ret = re.compile('\d+')#預編譯一遍 以后用的好拿來就用 不在需要重復理解這個正則了# res1 = ret.search('alex37176') 與之前的效果一樣#a = re.sub(ret,'H','alex123wusir456',1)#與之前效果一樣 但提升了效率 # finditer -- 節省空間 返回一個迭代器 # finditer -- 節省空間 ret = re.finditer('\d+','agks1ak018093')#返回迭代器 里面是變量 利用for循環取值 # ret = re.findall('\d+','agks1ak018093')#返回列表 取所有符合條件的,優先顯示分組中的 for i in ret:#i是一個變量 老朋友了不懂重學。。。print(i.group())#可以用 # 如何節省空間右提高了效率(其實所有的fro循環都消耗資源) # 先compile(如果沒有重復使用同一個正則,也不能節省時間) # 再finditer # 雜談 # 功能 性能 # # 時間 : # # 你要完成一個代碼所需要執行的代碼行數 # # 你在執行代碼的過程中,底層程序是如何工作的 # # 空間 # # 是占用了寶貴的內存條資源 # # 影響程序的執行效率 # # 用戶體驗re分組命名
# 問什么要有分組 # 爬蟲時正則內容過長 像數據庫子查詢的起別名 import re ret = re.search('\d(\d)\d(\w+?)(\d)(\w)\d(\d)\d(?P<name1>\w+?)(\d)(\w)\d(\d)\d(?P<name2>\w+?)(\d)(\w)','123abc45678agsf_123abc45678agsf123abc45678agsf') # 利用group想要取某一個分組中數據 原本要數 麻煩還容易出錯 所以出現了分組命名 格式--- (?P<名字>正則表達式) # ret.group('名字') print(ret.group('name1')) print(ret.group('name2')) # 分組命名的引用 # 分組命名(?P<組名1>正則)與(?P=組名1) 正則效果一樣 后面的引用了前面的 # 有的時候我們要匹配的內容是包含在不想要的內容之中的,# 只能先把不想要的內容匹配出來,然后再想辦法從結果中去掉 # 應用場景 # import re # exp= '<abc>akd7008&(&*)hgdwuih</abb>008&(&*)hgdwuih</abd>' # ret= re.search('<(?P<tag>\w+)>.*?</(?P=tag)>',exp)#加了問號就是非貪婪匹配 # print(ret)import re # exp= '<abc>akd7008&(&*)hgdwuih</abc>008&(&*)hgdwuih</abd>' # ret= re.search(r'<(\w+)>.*?</\1>',exp)#\1表示你匹配的正則第一個內容 加r去轉義 不好用 用分組命名 擴展 # 結論 在正則前面加rcollections模塊
# 在內置數據類型(dict、list、set、tuple)的基礎上,collections模塊還提供了幾個額外的數據類型:Counter、deque、defaultdict、namedtuple和OrderedDict等。 # 1.namedtuple: 生成可以使用名字來訪問元素內容的tuple # 2.deque: 雙端隊列,可以快速的從另外一側追加和推出對象 # 3.Counter: 計數器,主要用來計數 # 4.OrderedDict: 有序字典 # 5.defaultdict: 帶有默認值的字典轉載于:https://www.cnblogs.com/saoqiang/p/11377113.html
總結
以上是生活随笔為你收集整理的python之re模块collections模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 河南漯河警方承认交警代司机交罚款有错-罚
- 下一篇: [系统] Deepin系统常见问题解决(