正規表現基礎
$ 文字列の末尾
カテゴリー:アサーション①
改行に注意 !
前回・前々回では、先頭の位置にマッチする正規表現を説明しました。
今度は位置にマッチする正規表現の中で、末尾を表す $ について解説します。
末尾とは、文字列の末尾、あるいは文字列の末尾の改行の直前と定義されます。
また、文字列の途中に改行がある場合、各改行の直前も末尾とするかは、フラグによります。
末尾のみはイメージし易いと思いますが、改行に関しては少々面倒なので、詳しくみていきたいと思います。
この記事の難度は、基礎 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())
実行結果
末尾にマッチしています。
では、$ と文字を組み合わせて、末尾の文字を表現してみます。
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())
実行結果
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())
実行結果
文字列の末尾に一致している事は、上の結果と同様です。
ここで着目するのは、文字列の末尾の改行の直前にもマッチしている事です。
故に、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())
実行結果
文字列の末尾に改行があっても、 $ はマッチしました。
それでは、末尾ではなく、文字列の途中に改行がある場合を考えてみましょう。
文字列の途中に改行あり
文字列の途中に改行がある際に、$ の動作を調べます。
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())
実行結果
文字列の途中にある改行は、その直前を末尾とは判断していません。
以下の例では、途中にある改行の直前の文字はマッチしません。
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())
実行結果
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())
実行結果
各改行の直前も末尾の扱いになりました。
先ほどの 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())
実行結果
今度は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())
実行結果
meta12_8.py と等しく、2つの t がマッチしています。
$ に関してはここまでです。
文字列の末尾に対する、$ の操作を習得しました。
次は、$ とよく似た \Z を解説します。
関連記事
^ 行の先頭
正規表現: | アサーション① |
難度 : | 入門〜基礎 |
事前知識: | Pythonの基礎文法(reモジュールを含む) |
学習効果: | ^ を用いて、先頭の文字(改行直後も含む)にマッチさせる事が出来るようになる。 |
\A 文字列の先頭
正規表現: | アサーション① |
難度 : | 入門〜基礎 |
事前知識: | Pythonの基礎文法(reモジュールを含む) |
学習効果: | ^ との違いを理解出来るようになる。 |
$ 文字列の末尾
正規表現: | アサーション① |
難度 : | 基礎 |
事前知識: | Pythonの基礎文法(reモジュールを含む) |
学習効果: | 文字列の末尾に対する、$ による操作方法の習得。( $ の改行に対する動作も含む) |
\Z 文字列の末尾
正規表現: | アサーション① |
難度 : | 入門〜基礎 |
事前知識: | Pythonの基礎文法(reモジュールを含む) |
学習効果: | 末尾に対するマッチ。及び、$ との違いを会得出来る。 |
正規表現をPythonから使うには ?
正規表現: | Pythonから使う |
難度 : | 入門 |
事前知識: | Pythonの基礎文法 |
学習効果: | pythonから正規表現を使う一連の流れを掴む |
ハロー ! メタキャラクタ
正規表現: | メタキャラクタの概要 |
難度 : | 入門 |
事前知識: | 不要 |
学習効果: | メタキャラクタの概要を掴む |
正規表現とは?
正規表現: | 概要 |
難度 : | 入門 |
事前知識: | 不要 |
学習効果: | 正規表現の概要を知る |
PR