チラ裏備忘録

情報整理

Python 正規表現(matchとsearchの違い,subの使い方)

matchとsearchの違い

違いを簡単に言うと,

match…先頭から探索(文章の途中にマッチするものがあってもNoneとなる)

re.match(r"Hello.*", "aaaaaaaaHello, world!")
# None

search…文章の途中からでもマッチする

result = re.search(r"Hello.*", "aaaaaaaaHello, world!")
result
# <re.Match object; span=(8, 21), match='Hello, world!'>
result.group(0)
# Hello, world!

# 開始位置,終了位置,範囲を取得
result.start() # 8
result.end() # 21
result.span() # (8, 21)

re --- 正規表現操作 — Python 3.8.3rc1 ドキュメント

re.search(pattern, string, flags=0)

string を走査し、正規表現 pattern がマッチを生じさせる最初の場所を探して、対応する マッチオブジェクト を返します。文字列内にパターンにマッチする場所がなければ None を返します。これは文字列のどこかで長さ 0 のマッチを見つけるのとは異なることに注意してください。

re.match(pattern, string, flags=0)

string の先頭で 0 個以上の文字が正規表現 pattern にマッチすれば、対応する マッチオブジェクト を返します。文字列がパターンにマッチしなければ None を返します。これは長さ 0 のマッチとは異なることに注意して下さい。

subの使い方

正規表現を用いて文字列を置換できる.

msg = "test123hello"
re.sub(r"[0-9]*", "", msg)
# testhello

re.sub(pattern, repl, string, count=0, flags=0)

string 中に出現する最も左の重複しない pattern を置換 repl で置換することで得られる文字列を返します。 パターンが見つからない場合、 string がそのまま返されます。 repl は文字列または関数です。 repl が文字列の場合は、その中の全てのバックスラッシュエスケープが処理されます。 \n は 1 つの改行文字に変換され、 \r はキャリッジリターンに変換される、などです。 ASCII 文字のエスケープで未知のものは将来使うために予約されていて、エラーとして扱われます。 それ以外の \& のような未知のエスケープは残されます。 \6 のような後方参照は、パターンのグループ 6 がマッチした部分文字列で置換されます。