python05-正則表達式(二)

正則表達式(二)

re模塊(regex)

  • python中沒有正則表達式的函數,需要引入內置的re模塊

  • re模塊方法:

    • match:從頭開始匹配,只匹配一個結果
      • 作用:接收用戶傳遞過來的url進行匹配(web框架用到)
    • search:整個字符串進行匹配,只匹配第一個獲得的結果
    • findall:匹配整個字符串,返回一個列表對象
    • finditer:和findall非常類似,返回一個可迭代的對象,迭代的時候才會創建值
    • split:字符串切割
    • sub:替換
    • 最常用match和findall來查找
  • 分組的作用:

    • 在匹配得到的結果中獲取局部的值
  • re模塊查找分類(match,search,findall):

    • 普通匹配:
      • 通過match和search匹配成功返回的對象中,group得到的匹配得到的完整結果
    regex = 'H\w+'
    ret = re.match(regex, origin)
    print(ret.group())      # Hello
    print(ret.groups())     # ()
    print(ret.groupdict())  # {}
    
    • 分組匹配:
      • 分組來獲取局部的值
    • match:從頭開始匹配
    origin = 'Hello tom, xxx tom, yyy tom haha 19'
    regex = '(H)(\w+)'
    ret = re.match(regex, origin)
    print(ret.group())      # Hello
    print(ret.groups())     # ('H', 'ello')
    print(ret.groupdict())  # {}
    
    origin = 'Hello tom, xxx tom, yyy tom haha 19'
    regex = '(?P<n1>H)(\w+)'
    ret = re.match(regex, origin)
    print(ret.group())      # Hello
    print(ret.groups())     # ('H', 'ello')
    print(ret.groupdict())  # {'n1': 'H'}
    
    • search:知道了group方法之后,searh方法和match方法是一樣的,match是從頭開始匹配,search是全局匹配

    • findall:返回匹配成功的列表

      • 不分組:
      regex = 'app\w+'
      origin = 'i have an apple, i have a pen, apple pen'
      ret = re.findall(regex, origin)
      print(ret) # ['apple', 'apple']
      
      • 分組:
        • findall會把groups里面的所有東西放到列表里面(分組的作用:獲取局部的東西)
        • findall對?P<key>不起作用
        • 如果分組嵌套分組,則先取外面的,再取里面的
      egex = '(app\w+)'
      origin = 'i have an apple, i have a pen, apple pen'
      ret = re.findall(regex, origin)
      print(ret) # ['apple', 'apple']
      
      regex = '(app)\w+'
      origin = 'i have an apple, i have a pen, apple pen'
      ret = re.findall(regex, origin)
      print(ret) # ['app', 'app']
      
      regex = '(app)(\w+)'
      origin = 'i have an apple, i have a pen, apple pen'
      ret = re.findall(regex, origin)
      print(ret) # [('app', 'le'), ('app', 'le')]
      
      regex = '((a)(pp))(\w+)'
      origin = 'i have an apple, i have a pen, apple pen'
      ret = re.findall(regex, origin)
      print(ret) # [('app', 'a', 'pp', 'le'), ('app', 'a', 'pp', 'le')]
      
    • finditer:只有在迭代的時候才創建對象

      • 迭代的對象跟match和search獲得的對象一樣
    regex = '((a)(pp))(\w+)'
    origin = 'i have an apple, i have a pen, apple pen'
    
    ret1 = re.search(regex, origin)
    print('type of search', type(ret1)) 
    # type of search <class '_sre.SRE_Match'>
    ret2 = re.finditer(regex,origin)
    for i in ret2:
        print('type of finditer', type(i)) 
        # type of finditer <class '_sre.SRE_Match'>
    
  • 分組注意事項:

    • 分組的是按照你真是寫了多少個組來確定的,如果獲得的值多于寫的組個數,則去最后一個
    regex = '(\w)(\w)(\w)(\w)'
    ret = re.findall(regex, 'tony')
    print(ret) # [('t', 'o', 'n', 'y')]
    
    regex = '(\w){4}'
    ret = re.findall(regex, 'tony')
    print(ret) # [y]
    
    • 第一個寫了4個組,每個組一個字符:(\w)(\w)(\w)(\w),所以得到的結果是4個組
    • 第二個寫的是1個組,需要匹配4個字符,因為真正寫的只有一個組,所有得到的結果為1個組,理論上每個字符的組都是一樣的,最后的會覆蓋前面的,所以取得的是最后一個
    ret = re.findall('\dyhh*', '1yhh2yhh3andyhh4yhh')
    print(ret) # ['1yhh', '2yhh', '4yhh']
    
    ret = re.findall('(\dyhh)*', '1yhh2yhh3andyhh4yhh')
    print(ret) # ['2yhh', '', '', '', '', '', '', '', '4yhh', '']
    
    • 匹配時盡量避免正則表達式為空值
  • split:分割

    • 無分組分割:分割后不包含自己(分隔符)
    • 分組分割:分割后會保留分割符內分組的內容
    regex = '\d+'
    origin = 'ad12ad134a34da'
    ret = re.split(regex, origin)
    print(ret) # ['ad', 'ad', 'a', 'da']
    
    regex = '(\d+)'
    origin = 'ad12ad134a34da'
    ret = re.split(regex, origin, 1)
    print(ret) # ['ad', '12', 'ad134a34da']
    
    • 使用場景:計算器獲取最里層的括號同時取出括號
    origin = '7+((3+4)*5-(4-9)*5)*4'
    regex = '\(([^()]+)\)' # 獲取最里層的括號,同時對括號里的數據歸到組里,切割后保留括號內的內容
    ret = re.split(regex, origin, maxsplit=1)
    print(ret) # ['7+(', '3+4', '*5-(4-9)*5)*4']
    
    • 再根據切割后得到的結果是否是長度為3的列表,不斷循環計算其值
    while True:
        ret = re.split(regex, origin, maxsplit=1)
        if len(ret) == 3:
            計算得到括號的值,然后重新組合origin字符串
        elif:
            break同時帶出結果
    
  • sub:替換 && subn:替換返回一個元組

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內容

  • 正則表達式 python無正則表達式,通過別的模塊re(regex模塊)應用過來import re # 引入re模...
    AndroidCat閱讀 323評論 0 0
  • 1.正則表達式概述 正則表達式,又稱正規表示式、正規表示法、正規表達式、規則表達式、常規表示法(英語:Regula...
    TENG書閱讀 859評論 0 1
  • 本文介紹了Python對于正則表達式的支持,包括正則表達式基礎以及Python正則表達式標準庫的完整介紹及使用示例...
    Python程序媛閱讀 1,360評論 0 22
  • re模塊手冊 本模塊提供了和Perl里的正則表達式類似的功能,不關是正則表達式本身還是被搜索的字符串,都可以...
    喜歡吃栗子閱讀 4,037評論 0 13
  • 今天跟老司機那兒解鎖的一個酷炫PS功能。 這兩天老看到有人在秀用PS的3D功能做的立體風格的海報,心癢之下終于也打...
    阿隨向前沖閱讀 31,053評論 33 200