Pythonでre! - 正規表現のグループまとめ
今更ですがPythonの正規表現モジュール「re」の個人的まとめです。
わざわざ自分で書かなくても他の方がまとめられてる内容なんですが、まぁ自分用メモって事で自分用にメモメモ。
■正規表現
正規表現はひとつの文字列で色んな文字を取ってこれる凄いヤツですね。
Pythonではreモジュールによって使用することができます。
■コンパイルしときましょ
ぷよぷよの会社ではありません。
re.searchメソッドによっていきなり正規表現を使用する事もできるのですが、コンパイルするとその後の処理が高速化するらしいので、とりあえずコンパイルしておきましょう。
コンパイルされたオブジェクトはsearchやmatchなどの正規表現実行メソッドをもっています。 ここから先の使用方法はre.searchやre.matchと同じですが、第一引数に正規表現はいらないのが違いです。
また、置換関数のsubやfindallなどほとんどの関数を使用する事ができます。
■グループ
さて、ここからが本題。 Pythonのreモジュールはグループ処理もサポートしています。グループ処理をするためには()で囲えばOK。
わざわざ自分で書かなくても他の方がまとめられてる内容なんですが、まぁ自分用メモって事で自分用にメモメモ。
■正規表現
正規表現はひとつの文字列で色んな文字を取ってこれる凄いヤツですね。
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.個別参照<br> ()でかこったグループごとに抜き出して参照する事が出来ます。
group(0)でグループに関係せず全体の結果を、group(1)~からで左から順にアクセス可能となります。
これは便利な子やでぇっ!
因みに()で囲われなかった部分は個別には参照できません。参照したい場合は必ず()で囲みましょう。
■グループ : 2.置換時に特定のグループの中身を参照
上記のグループの個別参照は、置換用メソッド「sub」内でも使用する事ができます。これにより特定部分は残しつつそれ以外をマッチでひっかけて置換するような技もできます。
(今回の例では1番がtestfilename、3番がv01)
もちろん置換なので並び替えや複数回の使用も可能!
と言うことで正規表現のグループ、わざわざスクリプトを組まなくともこれらを使用すればわずか1行でかなり複雑な置換処理や部分的な参照ができちゃいます。
めちゃ便利やん!!!
- グループ化された箇所だけを個別に参照できる
- 置換時に特定のグループを参照する事ができる
う~む、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行でかなり複雑な置換処理や部分的な参照ができちゃいます。
めちゃ便利やん!!!
スポンサーサイト