正規表現

グループ・選択 ()_3 _key-visual

名前で呼び出す

 グループ化についての第三回です。

最終回で取り扱うテーマは、名前つきグループについてです。

グループ化された箇所を参照するには、通常は順に振られた数字です。

しかし番号ではなく、任意に付けた名前でアクセスする事も可能なのです。

 その為の表記は、(?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"))
                            


実行結果 グループ・選択 ( )名前付きグループ _1

 グループ名でアクセスできました。

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))
                            


実行結果 グループ・選択 ( )名前付きグループ _2

 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))
                            


実行結果 グループ・選択 ( )名前付きグループ _3

 後方参照でも問題無く使えます。

| (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))
                            


実行結果 グループ・選択 ( )名前付きグループ _4

 この場合でも特に問題はなさそうです。

置換

 グループ名を用いて、置換の際に後方参照を行います。

(置換 については【正規表現による置換と分割】で詳しく説明しています。)

置換後の文字列を指定する際に、\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)
                            


実行結果 グループ・選択 ( )名前付きグループ _5

 置換されている事を確認出来ました。



 以上で3回にわたって解説してきた、グループ化の処理については終了です。

グループ化された箇所の取得から始まり、後方参照やグループ名での処理など、グループ化における一連の操作を習得出来ました。

グループ化の処理は、少々込み入っていると感じる人が多いようでうす。

易々理解出来た人は、正規表現の素質に恵まれています。

関連記事

基礎3 | グループ・選択_key-visual

| OR(または)

正規表現: グループ・選択
難度       : 入門〜基礎
事前知識: Pythonの基礎文法(reモジュールを含む)。
学習効果: 選択(OR) を習得し、[ ](文字クラス) との違いも理解出来る。
基礎3 ( ) グループ・選択_key-visual

( ) グループを指定

正規表現: グループ・選択
難度       : 基礎
事前知識: Pythonの基礎文法(reモジュールを含む)
学習効果: パターン中の一部分を取得する事が出来るようになる。
基礎3 ( )キャプチャ グループ・選択_key-visual

( ) キャプチャを使う

正規表現: グループ・選択
難度       : 基礎
事前知識: Pythonの基礎文法(reモジュールを含む)。正規表現の文字クラスや置換処理等。
学習効果: 後方参照が出来るようになる。
基礎3 ( )名前つきグループ グループ・選択_key-visual

( ) 名前つきグループ

正規表現: グループ・選択
難度       : 基礎
事前知識: Pythonの基礎(reモジュールを含む)、置換処理等
学習効果: 名前つきグループの全般の処理。特に、後方参照を任意の名前で出来るようになる。
Pythonで正規表現を使う1

正規表現をPythonから使うには ?

正規表現: Pythonから使う
難度       : 入門
事前知識: Pythonの基礎文法
学習効果: pythonから正規表現を使う一連の流れを掴む
メタキャラクタに馴染む_key-visual

ハロー ! メタキャラクタ

正規表現: メタキャラクタの概要
難度       : 入門
事前知識: 不要
学習効果: メタキャラクタの概要を掴む
正規表現の概要_key-visual

正規表現とは?

正規表現: 概要
難度       : 入門
事前知識: 不要
学習効果: 正規表現の概要を知る
正規表現の概要

PR