正規表現

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

改行に注意 !

 前回前々回では、先頭の位置にマッチする正規表現を説明しました。

今度は位置にマッチする正規表現の中で、末尾を表す $ について解説します。

末尾とは、文字列の末尾、あるいは文字列の末尾の改行の直前と定義されます。

 また、文字列の途中に改行がある場合、各改行の直前も末尾とするかは、フラグによります。

末尾のみはイメージし易いと思いますが、改行に関しては少々面倒なので、詳しくみていきたいと思います。


この記事の難度は、基礎  Cクラスです。

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

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

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

Contens  |   目次

Chapter1 Pythonで実行

Chapter1   Pythonで実行

改行なし

 末尾に $ がマッチする事を確認します。

対象となる文字列には、改行を含まないものを選んでいます。

    re_meta12_1.py

        import  re

        pattern = re.compile("$")
        st ="P"
        result_iter = pattern.finditer(st)
        for   result   in  result_iter:
            print("-------- match ↓ ---------")        
            print(result.group())    
            print(result.span())    
                            


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

 末尾にマッチしています。

では、$ と文字を組み合わせて、末尾の文字を表現してみます。

    re_meta12_2.py

        import  re

        pattern = re.compile("t$")
        st ="stet"
        result_iter = pattern.finditer(st)
        for   result   in  result_iter:
            print("-------- match ↓ ---------")        
            print(result.group())    
            print(result.span())    
                            


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

 stet の中には2つの t がありますが、末尾の t のみに一致しています。

次は、改行がある場合の $ の動作を検証します。

文字列の末尾に改行あり

    re_meta12_3.py

        import  re

        pattern = re.compile("$")
        st ="P\n"
        result_iter = pattern.finditer(st)
        for   result   in  result_iter:
            print("-------- match ↓ ---------")        
            print(result.group())    
            print(result.span())    
                            


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

 文字列の末尾に一致している事は、上の結果と同様です。

ここで着目するのは、文字列の末尾の改行の直前にもマッチしている事です。

故に、meta12_2.py の対象文字列の末尾に、改行が入っていても結果は等しくなります。

    re_meta12_4.py

        import  re

        pattern = re.compile("t$")
        st ="stet\n"
        result_iter = pattern.finditer(st)
        for   result   in  result_iter:
            print("-------- match ↓ ---------")        
            print(result.group())    
            print(result.span())    
                            


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

 文字列の末尾に改行があっても、 $ はマッチしました。

それでは、末尾ではなく、文字列の途中に改行がある場合を考えてみましょう。

文字列の途中に改行あり

 文字列の途中に改行がある際に、$ の動作を調べます。

    re_meta12_5.py

        import  re

        pattern = re.compile("$")
        st ="p\ny\n"
        result_iter = pattern.finditer(st)
        for   result   in  result_iter:
            print("-------- match ↓ ---------")        
            print(result.group())    
            print(result.span())    
                            


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

 文字列の途中にある改行は、その直前を末尾とは判断していません。

以下の例では、途中にある改行の直前の文字はマッチしません。

    re_meta12_6.py

        import  re

        pattern = re.compile("t$")
        st ="st\net\n"
        result_iter = pattern.finditer(st)
        for   result   in  result_iter:
            print("-------- match ↓ ---------")        
            print(result.group())    
            print(result.span())    
                            


実行結果 ゼロ幅アサーション① $ _6

 2つ目の t のみ一致しています。

最初の t も含めたいときは、フラグを用います。

MULTILINEフラグ

 MULTILINEフラグ(あるいは Mフラグ)を使う事により、各改行の直前も末尾とされます。

    re_meta12_7.py

        import  re

        pattern = re.compile("$",flags=re.MULTILINE)
        st ="p\ny\n"
        result_iter = pattern.finditer(st)
        for   result   in  result_iter:
            print("-------- match ↓ ---------")        
            print(result.group())    
            print(result.span())    
                            


実行結果 ゼロ幅アサーション① $ _7

 各改行の直前も末尾の扱いになりました。

先ほどの meta12_6.py を、MULTILINEフラグを付けて再度実行してみます。

    re_meta12_8.py

        import  re

        pattern = re.compile("t$",flags=re.MULTILINE)
        st ="st\net\n"
        result_iter = pattern.finditer(st)
        for   result   in  result_iter:
            print("-------- match ↓ ---------")        
            print(result.group())    
            print(result.span())    
                            


実行結果 ゼロ幅アサーション① $ _8

 今度は2つの t がマッチしました。

なお、MULTILINEフラグではなく、インラインフラグの(?m)でも同様の効果が得られます。

インラインフラグ

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

    re_meta12_9.py

        import  re

        pattern = re.compile("(?m)t$")
        st ="st\net\n"
        result_iter = pattern.finditer(st)
        for   result   in  result_iter:
            print("-------- match ↓ ---------")        
            print(result.group())    
            print(result.span())    
                            


実行結果 ゼロ幅アサーション① $ _9

 meta12_8.py と等しく、2つの t がマッチしています。



 $ に関してはここまでです。

文字列の末尾に対する、$ の操作を習得しました。

は、$ とよく似た \Z を解説します。

関連記事

基礎2 ^ アサーション①_key-visual

^ 行の先頭

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

\A 文字列の先頭

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

$ 文字列の末尾

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

\Z 文字列の末尾

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

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

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

ハロー ! メタキャラクタ

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

正規表現とは?

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

PR