正規表現

ゼロ幅アサーション①_^_key-visual

位置にマッチ

 さて今回は、文字そのものではなく、位置にマッチする正規表現をみていきます。

これらの正規表現は、言明(アサーション) または、ゼロ幅アサーション、ゼロ幅マッチ などと呼ばれています。

 この中でも、先頭の位置を表す正規表現が ^ です。

先頭といった場合、文章の先頭のみを指すのか、あるいは各改行の直後も先頭とみなすのかは、フラグに依存します。

この事も含めて、実際に試してみましょう。


この記事の難度は、入門〜基礎  Bクラスです。

(A: やさしい   →   E: 難しい)

 事前知識として、pythonから正規表現を扱う方法が必要になります。

難度       :
事前知識: Pythonの基礎文法(reモジュールを含む)。
学習効果:  ^ を用いて、先頭の文字(改行直後も含む)にマッチさせる事が出来るようになる。

Contens  |   目次

Chapter1 Pythonで実行

Chapter1   Pythonで実行

フラグなし

 フラグの話に入る前に、一旦 ^ の使い方を説明します。

まずは試しに ^ のみで実行してみます。

    re_meta10_1.py

        import  re

        pattern = re.compile("^")
        st ="mathematics"
        result = pattern.search(st)
        print(result)
                            


実行結果 ゼロ幅アサーション① ^ _1

 確かに先頭の位置にはマッチしているようです。

しかし、これでは文字自体に何も一致していないので、先頭文字の m も含めてパターンを構成する必要があります。

なお、search() の代わりに、複数回のマッチにも対応出来る finditer() をここから使います。

(finditer() については【パターンを探すメゾットを知る】のページで詳しく説明しています。)

    re_meta10_2.py

        import  re

        pattern = re.compile("^m")
        st ="mathematics"
        result_iter = pattern.finditer(st)
        for   result   in  result_iter:
            print(result.group())    
            print(result.span())    
                            


実行結果 ゼロ幅アサーション① ^ _2

 対象文字列の中で2つある m の内、先頭の m のみに一致しました。

今度は、改行文字も含めて検証してみます。

改行直後 m も ^m にマッチするかどうかです。

    re_meta10_3.py

        import  re

        pattern = re.compile("^m")
        st ="mathe\nmatics"
        print(st) 
        result_iter = pattern.finditer(st)
        for   result   in  result_iter:
            print("-------- match ↓ ---------")
            print(result.group())    
            print(result.span())    
                            


実行結果 ゼロ幅アサーション① ^ _3

 改行直後の m は、先頭とは判断されませんでした。

先頭に含むには、フラグが必要になります。

MULTILINEフラグ

 MULTILINEフラグ(あるいは Mフラグ)を指定すると、^ は文字列の先頭、および各行の先頭 (各改行の直後)でマッチするようになります。

    re_meta10_4.py

        import  re

        pattern = re.compile("^m",flags=re.MULTILINE)
        st ="mathe\nmatics"
        print(st) 
        result_iter = pattern.finditer(st)
        for   result   in  result_iter:
            print("-------- match ↓ ---------")
            print(result.group())    
            print(result.span())    
                            


実行結果 ゼロ幅アサーション① ^ _4

 改行直後の m にもマッチしました。

この他に、インラインフラグを用いても同様の結果を得られます。

インラインフラグ

 文字列パターンの先頭に (?m) を記述します。

    re_meta10_5.py

        import  re

        pattern = re.compile("(?m)^m")
        st ="mathe\nmatics"
        print(st) 
        result_iter = pattern.finditer(st)
        for   result   in  result_iter:
            print("-------- match ↓ ---------")
            print(result.group())    
            print(result.span())    
                            


実行結果 ゼロ幅アサーション① ^ _5

 meta10_4.pyと等しい結果です。



 以上で ^ についての解説は終了です。

^ を用いて、先頭の文字(改行直後も含む)にマッチさせる事が出来るようになりました。

次回は、^ とよく似た \A について触れていきます。

関連記事

基礎2

^ 行の先頭

正規表現: アサーション①
難度       : 入門〜基礎
事前知識: Pythonの基礎文法(reモジュールを含む)
学習効果: ^ を用いて、先頭の文字(改行直後も含む)にマッチさせる事が出来るようになる。
基礎2

\A 文字列の先頭

正規表現: アサーション①
難度       : 入門〜基礎
事前知識: Pythonの基礎文法(reモジュールを含む)
学習効果: ^ との違いを理解出来るようになる。
基礎2

$ 文字列の末尾

正規表現: アサーション①
難度       : 基礎
事前知識: Pythonの基礎文法(reモジュールを含む)
学習効果: 文字列の末尾に対する、$ による操作方法の習得。( $ の改行に対する動作も含む)
基礎1

\Z 文字列の末尾

正規表現: アサーション①
難度       : 入門〜基礎
事前知識: Pythonの基礎文法(reモジュールを含む)
学習効果: 末尾に対するマッチ。及び、$ との違いを会得出来る。
Pythonで正規表現を使う1

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

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

ハロー ! メタキャラクタ

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

正規表現とは?

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

PR