正規表現基礎
( ) グループを指定
カテゴリー:グループ・選択
パターンの一部を取得する
さて、今回から3回にわたり ( ) について解説します。
( ) は、グループを表す正規表現です。
パターン文字列中に ( ) を組み込んだ場合、マッチした文字列全体の中で ( )の部分のみを取得する事が可能です。
例えば、パターンを "telephone" とした場合を考えます。
"telephone" の中で "phone" の部分を ( ) で囲んでグループ化します。
すると、パターン文字列が "tele(phone)" のようになります。
このパターンがマッチした際には、telephone だけでなく phone のみを取り出す事も出来ます。
他にも、前回紹介した | と併用する事で、OR(または)の範囲を区切るようにも使えます。
以下で、順を追って詳しくみていきます。
この記事の難度は、基礎 Cクラスです。
(A: やさしい → E: 難しい)
事前知識として、pythonから正規表現を扱う方法が必要になります。
また、選択(OR)を表す正規表現や、文字クラスの知識があるとよいでしょう。
難度 : | |
事前知識: | Pythonの基礎文法(reモジュールを含む)。正規表現の文字クラス等。 |
学習効果: | パターン中の一部分を取得する事が出来るようになる。 |
Contens | 目次
Chapter1 | Pythonで実行 |
Chapter1 Pythonで実行
単数マッチ
では、上記したパターン文字列である "tele(phone)" を実行します。
文字列の取得には、マッチオブジェクトの group() を使います。
(group() については【パターンを探すメゾットを知る】のChapter2で詳しく説明しています。)
使用するPythonのバージョンは 3.7 です。
re_meta15_1.py import re pattern = re.compile("tele(phone)") st ="telephone" result = pattern.search(st) if result: print("group(0):",result.group(0)) print("group(1):",result.group(1))
実行結果
phone のみでも取得できました。
今度は ( ) の数をもう少し増やしてみましょう。
re_meta15_2.py import re pattern = re.compile("令和(\d)年(\d)月(\d)日") st ="令和1年3月4日" result = pattern.search(st) if result: for i in range(result.lastindex + 1): print('group{num};'.format(num = i),result.group(i))
実行結果
グルーピングした数字の部分を取り出せています。
複数回のマッチ
( ) でグループ化した箇所が、複数回マッチした場合をみていきます。
この際に利用するのは finditer() にします。
(finditer() については【パターンを探すメゾットを知る】のChapter3で詳しく説明しています。)
re_meta15_3.py import re pattern = re.compile("(\d)月") st ="1月 3月 4月 9月 新月 満月" result_iter = pattern.finditer(st) for result in result_iter: print("group(0):",result.group(0)) print("group(1):",result.group(1))
実行結果
複数回のマッチでも、その分に対応する箇所を取得できました。
| との併用
( ) と | を組み合わせて使ってみます。
OR(または) に含める範囲を、 ( ) で区切る事が出来ます。
re_meta15_4.py import re # | (選択)を用いる。 tele か cell のどちらか。 pattern = re.compile("(tele|cell)phone") st ="telephone cellphone headphone" result_iter = pattern.finditer(st) for result in result_iter: print("group(0):",result.group(0)) print("group(1):",result.group(1))
実行結果
| により phone の前が、 tele か cell である場合にマッチしています。
複数個のグループで複数回のマッチ
最後に少し複雑ですが、パターンが複数のグループで構成され、それが複数回マッチする場合を実行します。
re_meta15_5.py import re pattern = re.compile("(令和|平成)(\d)年(\d)月") st ="令和2年3月 平成7年1月 昭和5年2月" result_iter = pattern.finditer(st) for result in result_iter: for i in range(result.lastindex + 1): print('group{num};'.format(num = i),result.group(i))
実行結果
各々のマッチ毎に、グループ化された文字列が取り出されました。
グループ化について、一回目の解説はここまでです。
パターン中の一部分を取得する事が出来るようになりました。
二回目である次回は、キャプチャについてです。
関連記事
| OR(または)
正規表現: | グループ・選択 |
難度 : | 入門〜基礎 |
事前知識: | Pythonの基礎文法(reモジュールを含む)。 |
学習効果: | 選択(OR) を習得し、[ ](文字クラス) との違いも理解出来る。 |
( ) グループを指定
正規表現: | グループ・選択 |
難度 : | 基礎 |
事前知識: | Pythonの基礎文法(reモジュールを含む) |
学習効果: | パターン中の一部分を取得する事が出来るようになる。 |
( ) キャプチャを使う
正規表現: | グループ・選択 |
難度 : | 基礎 |
事前知識: | Pythonの基礎文法(reモジュールを含む)。正規表現の文字クラスや置換処理等。 |
学習効果: | 後方参照が出来るようになる。 |
( ) 名前つきグループ
正規表現: | グループ・選択 |
難度 : | 基礎 |
事前知識: | Pythonの基礎(reモジュールを含む)、置換処理等 |
学習効果: | 名前つきグループの全般の処理。特に、後方参照を任意の名前で出来るようになる。 |
正規表現をPythonから使うには ?
正規表現: | Pythonから使う |
難度 : | 入門 |
事前知識: | Pythonの基礎文法 |
学習効果: | pythonから正規表現を使う一連の流れを掴む |
ハロー ! メタキャラクタ
正規表現: | メタキャラクタの概要 |
難度 : | 入門 |
事前知識: | 不要 |
学習効果: | メタキャラクタの概要を掴む |
正規表現とは?
正規表現: | 概要 |
難度 : | 入門 |
事前知識: | 不要 |
学習効果: | 正規表現の概要を知る |
PR