正規表現基礎
( ) 名前つきグループ
カテゴリー:グループ・選択
名前で呼び出す
グループ化についての第三回です。
最終回で取り扱うテーマは、名前つきグループについてです。
グループ化された箇所を参照するには、通常は順に振られた数字です。
しかし番号ではなく、任意に付けた名前でアクセスする事も可能なのです。
その為の表記は、(?P<name> ) となります。
name には付けたい名前を記述します。
これにより、マッチオブジェクトからは、group("name") のように利用できます。
キャプチャされたものは、(?P=name) とする事で後方参照を行えます。
具体例を実行した方が分かり易いかと思いますので、以下で慣れてしまいましょう。
この記事の難度は、基礎 Cクラスです。
(A: やさしい → E: 難しい)
事前知識として、pythonから正規表現を扱う方法が必要になります。
また、正規表現における文字クラスの知識や、置換処理を理解している事が望ましいです。
(不安な人でも、【正規表現をPythonから使うには ?】【基礎1 文字クラス】【正規表現による置換と分割】で詳しい解説があるので安心です。)
難度 : | |
事前知識: | Pythonの基礎文法(reモジュールを含む)。正規表現の文字クラスや置換処理等。 |
学習効果: | 名前つきグループの全般の処理。特に、後方参照を任意の名前で出来るようになる。 |
Contens | 目次
Chapter1 | Pythonで実行 |
Chapter1 Pythonで実行
(?P<name> )
まずは、マッチオブジェクトからグループ名を使ってみます。
なお、以下で使用するPythonのバージョンは 3.7 です。
re_meta17_1.py import re pattern = re.compile("(?P<first>never)theless") st ="nevertheless" result = pattern.search(st) if result: print(result.group()) print(result.group("first")) print(result.span("first"))
実行結果
グループ名でアクセスできました。
groupdict()
次は、groupdict()を使ってみましょう。
groupdict() は、グループ名をキーとする辞書を返します。
re_meta17_2.py import re pattern = re.compile("(?P<first>\d)\+(?P<second>\d)=(?P<third>\d)") st ="1+2=3" result = pattern.search(st) if result: dic = result.groupdict() print("dic:",dic) for key,val in dic.items(): print("group<{name}>;".format(name=key),val)) print("span;",result.span(key))
実行結果
groupdict() が、グループ名とマッチした値の一覧を取得しています。
(?P=name)
今度はグループ名で、後方参照をしてみます。
例として、htmlで ul や li タグを使う場合を取り上げます。
re_meta17_3.py import re pattern = re.compile("<(?P<f>ul)><(?P<s>li)>\w</(?P=s)></(?P=f)>") st ="<ul><li>L</li></ul>" result = pattern.search(st) if result: dic = result.groupdict() print("match:",result.group()) print("dic:",dic) for key,val in dic.items(): print("group<{name}>;".format(name=key),val)) print("span;",result.span(key))
実行結果
後方参照でも問題無く使えます。
| (or) と併用
もう一つ例として | (or) と併用する場合をみてみます。
re_meta17_4.py import re # | (選択)を用いる。 グループ名 f は、tele か cell のどちらか。グループ名 s は、phone か port のどちらか。 pattern = re.compile("(?P<f>tele|cell)(?P<s>phone|port)") st ="teleport telephone cellphone headphone" result_iter = pattern.finditer(st) for result in result_iter: dic = result.groupdict() print("dic:",dic) for key,val in dic.items(): print("group<{name}>;".format(name=key),val)) print("span;",result.span(key))
実行結果
この場合でも特に問題はなさそうです。
置換
グループ名を用いて、置換の際に後方参照を行います。
(置換 については【正規表現による置換と分割】で詳しく説明しています。)
置換後の文字列を指定する際に、\g<name> として、name の箇所にグループ名を指定します。
re_meta17_5.py import re pattern = re.compile("(?P<f>東京)都(?P<s>品川)区") st ="東京都品川区" repl = r"\g<s>駅---\g<f>駅" result = pattern.sub(repl,st) print(result)
実行結果
置換されている事を確認出来ました。
以上で3回にわたって解説してきた、グループ化の処理については終了です。
グループ化された箇所の取得から始まり、後方参照やグループ名での処理など、グループ化における一連の操作を習得出来ました。
グループ化の処理は、少々込み入っていると感じる人が多いようでうす。
易々理解出来た人は、正規表現の素質に恵まれています。
関連記事
| OR(または)
正規表現: | グループ・選択 |
難度 : | 入門〜基礎 |
事前知識: | Pythonの基礎文法(reモジュールを含む)。 |
学習効果: | 選択(OR) を習得し、[ ](文字クラス) との違いも理解出来る。 |
( ) グループを指定
正規表現: | グループ・選択 |
難度 : | 基礎 |
事前知識: | Pythonの基礎文法(reモジュールを含む) |
学習効果: | パターン中の一部分を取得する事が出来るようになる。 |
( ) キャプチャを使う
正規表現: | グループ・選択 |
難度 : | 基礎 |
事前知識: | Pythonの基礎文法(reモジュールを含む)。正規表現の文字クラスや置換処理等。 |
学習効果: | 後方参照が出来るようになる。 |
( ) 名前つきグループ
正規表現: | グループ・選択 |
難度 : | 基礎 |
事前知識: | Pythonの基礎(reモジュールを含む)、置換処理等 |
学習効果: | 名前つきグループの全般の処理。特に、後方参照を任意の名前で出来るようになる。 |
正規表現をPythonから使うには ?
正規表現: | Pythonから使う |
難度 : | 入門 |
事前知識: | Pythonの基礎文法 |
学習効果: | pythonから正規表現を使う一連の流れを掴む |
ハロー ! メタキャラクタ
正規表現: | メタキャラクタの概要 |
難度 : | 入門 |
事前知識: | 不要 |
学習効果: | メタキャラクタの概要を掴む |
正規表現とは?
正規表現: | 概要 |
難度 : | 入門 |
事前知識: | 不要 |
学習効果: | 正規表現の概要を知る |
PR