STEP: 1 文字列の検索
文字列の検索
import re
S = input()
pattern = re.compile(r"paiza")
re_matched = re.search(pattern, S)
print(re_matched.start())
まず、正規表現を扱えるようにする為に import re
を冒頭に書きます。
次に、正規表現を書きます。正規表現は raw文字列 というものを使います。
r""
という書き方をします。通常の文字列で使う '
"
の前に r
を書き加えるだけです。
ここでは以降、一律して r""
と書くこととします。
ここに検索したい文字列を記述します。この問題は「'paiza' を見つけてその位置番号返す」ことが求められていますので r"paiza"
と記します。正規表現を使って書かれたこの形のものを「パターン (pattern)」と言います。
次にこのパターンを使って、入力 S
の中にパターンに指定した文字列があるかどうかを調べます。re.search(pattern, S)
これを試しに画面に出力してみると、
<re.Match object; span=(8, 13), match='paiza'>
と検索結果(オブジェクト)の中身が表示されます。span=(8, 13), match='paiza' は「文字列の 8 番目から 12 番目に 'paiza' があります。」という意味です。'paiza' の一文字目の p
が 8 番目、五文字目の a
が 12 番目です。range() と同じ範囲の示し方ですね。
正規表現では検索文字列を見つけた場合を、マッチしたと表現します。
最後の print() 関数でメソッドが使われています。
メソッド | 機能 |
---|---|
.group() | マッチした文字列を返す。()内はグループ番号。 |
.span() | マッチした文字列の範囲をタプルで返す。 |
.start() | マッチした文字列の開始位置番号を返す。 |
.end() | マッチした文字列の末尾の位置番号 +1 を返す。 |
グループというのはまたこの後の該当する問題で説明されます。これを使ってマッチした文字列を画面に表示させたり、その他、文字列としていろいろ使用したりできます。
この問題では開始位置を画面に出力するよう求めています。.start() メソッドを使えば一丁上がりです。ただこれでは文字列の .find() メソッドと変わりありません。次の問題からがいよいよ正規表現らしいパターンの書き方が登場します。
pattern = re.compile(r"paiza")
compile() 関数は、このパターンを何度も使う時に予め変数に入れておき、使うたびにパターンを作らなくて済むようにする為に書かれます。
pattern = r"paiza"
re_matched = re.search(pattern, S) # 関数
と書いたり、
re_matched = re.search(r"paiza", S)
と単体で書くこともできますが、いずれもその場で都度パターンを作る処理をしています。
また、コンパイルしたパターンに限り、
pattern = re.compile(r"paiza")
re_matched = pattern.search(S) # メソッド
という書き方ができます。
以降のプログラム例では一回しか使わなくても、見慣れる為に compile() 関数を使ってコンパイルしたものを使っていきます。
普段は少ししか使わないときはコンパイルする必要はありません。
って、この人が言ってました。