fc2ブログ

    Pythonでre! - 正規表現のグループまとめ

     今更ですがPythonの正規表現モジュール「re」の個人的まとめです。
     わざわざ自分で書かなくても他の方がまとめられてる内容なんですが、まぁ自分用メモって事で自分用にメモメモ。


    ■正規表現
     正規表現はひとつの文字列で色んな文字を取ってこれる凄いヤツですね。
     Pythonではreモジュールによって使用することができます。


    ■コンパイルしときましょ
     ぷよぷよの会社ではありません。
     re.searchメソッドによっていきなり正規表現を使用する事もできるのですが、コンパイルするとその後の処理が高速化するらしいので、とりあえずコンパイルしておきましょう。
    # -*- coding:utf-8 -*-
    
    import re
    reobj = re.compile('.*')  # Regex Objectが帰る
    


     コンパイルされたオブジェクトはsearchやmatchなどの正規表現実行メソッドをもっています。  ここから先の使用方法はre.searchやre.matchと同じですが、第一引数に正規表現はいらないのが違いです。
    # -*- coding:utf-8 -*-
    
    import re
    reobj = re.compile('[a-zA-Z]+')
    
    result = reobj.search('testfilename_map_v01.py')
    # 結果はtestfilenameが取れる
    
     何度も使用する場合、正規表現を何度も書かなくていいので非常に便利ですね。
     また、置換関数のsubやfindallなどほとんどの関数を使用する事ができます。


    ■グループ
      さて、ここからが本題。  Pythonのreモジュールはグループ処理もサポートしています。グループ処理をするためには()で囲えばOK。
    # -*- coding:utf-8 -*-
    
    import re
    reobj = re.compile('([a-zA-Z]+)_map_(v\d+).py')
    
    result = reobj.search('testfilename_map_v01.py')
    
     さてグループ化するとどんな事があるのかと言うと
    1. グループ化された箇所だけを個別に参照できる
    2. 置換時に特定のグループを参照する事ができる
     などなど。

     う~む、1と2が微妙に被ってる気がするが・・・まぁいいとしましょう。

    ■グループ : 1.個別参照<br> ()でかこったグループごとに抜き出して参照する事が出来ます。
    # -*- coding:utf-8 -*-
     
    import re
    reobj = re.compile('([a-zA-Z]+)_map_(v\d+).py')
     
    result = reobj.search('testfilename_map_v01.py')
    
    print result.group(0)
        # testfilename_map_v01.py
    print result.group(1)
        # testfilename
    print result.group(2)
        # v01
    
     このようにsearchメソッドでマッチした結果であるmatchオブジェクトのgroupからそれぞれアクセスする事ができます。
     group(0)でグループに関係せず全体の結果を、group(1)~からで左から順にアクセス可能となります。
     これは便利な子やでぇっ!
     因みに()で囲われなかった部分は個別には参照できません。参照したい場合は必ず()で囲みましょう。

    ■グループ : 2.置換時に特定のグループの中身を参照
     上記のグループの個別参照は、置換用メソッド「sub」内でも使用する事ができます。これにより特定部分は残しつつそれ以外をマッチでひっかけて置換するような技もできます。
    # -*- coding:utf-8 -*-
      
    import re
    reobj = re.compile('([a-zA-Z]+)_(map|obj)_(v\d+)')
    result = reobj.sub(r'\1_filedata_\3', 'testfilename_map_v01.py')
    
    # resultにはtestfilename_filedata_v01.pyが入る
    
     上の例ではtestfilename_~_v01.pyの~の」部分がmapまたはobjだった場合はfiledataに置き換えるようにしています。  \数字の部分はグループ番号になっており、該当するグループで置換を行ってくれます。
    (今回の例では1番がtestfilename、3番がv01)
     もちろん置換なので並び替えや複数回の使用も可能!

     と言うことで正規表現のグループ、わざわざスクリプトを組まなくともこれらを使用すればわずか1行でかなり複雑な置換処理や部分的な参照ができちゃいます。
     めちゃ便利やん!!!
    スポンサーサイト



    コメントの投稿

    非公開コメント

    プロフィール

    Eske

    Author:Eske
    萌えイラストレーターを目指す3DCGイラストレーター。
    現在ポケモンカードゲーム、ガンダムトライエイジ、ガンダムコンクエスト、妖怪ウォッチとりつきカードゲームなどで3DCGを使用したイラストレーターとして参加中。

    主にここでは日々気づいたメモなんかを残してます。
    イラストのお仕事も受け付けております。ココのメールアドレスからご連絡できますので、お気軽にご相談下さい。

    最新記事
    最新コメント
    カテゴリ
    最新トラックバック
    月別アーカイブ
    検索フォーム
    リンク
    QRコード
    QR