2014/10/07

ライブラリ:re

Pythonの「 re 」というライブラリをご紹介します。

import re

re は正規表現を扱うためのライブラリです。 re = Regular Expression の略ですね。

re の基本的な使い方を以下、見ていきます。


re.search()

re.search() は探索のための関数です。与えられたテキストの中の正規表現パターンを探索します。

例えばこんな感じ。

# ライブラリ読み込み
import re

# 対象テキスト
text = """
When you were born,
you cried and the world rejoiced.
Live your life so that when you die,
the world cries and you rejoice.
"""

# 一致するパターンを検索
# 「d」で終わる単語を探す
result = re.search(r"\w+d", text)

# 見つかれば結果を表示
# 見つからなければ no match とだけ表示
if result:
    print result.group()  # => 最初に一致したパターン
    print result.start(), result.end()  # => 一致した箇所のインデックス
    print result.span()  # => 上の start と end のタプル
else:
    print "no match"

re.search() が返す値は、一致するパターンが

  • 見つかった場合: マッチオブジェクト
  • 見つからなかった場合: None

となりますので、上の例のように re.search() の戻り値を if で判定することによって見つかった場合と見つからなかった場合の処理を分けることができます。


re.findall()


re.findall() も探索のための関数です。 re.search() が最初に一致したパターンをひとつだけ返すのに対し、 re.findall() は対象文字列の中から一致したパターンをすべて返します。戻り値はリストで、その各要素は文字列です( re.search() が返すようなマッチオブジェクトではありません)。

こちらもサンプルコードをあげてみます。

results = re.findall(r"\w+d", text)

# 見つかれば結果を表示
# 見つからなければ no match とだけ表示
if results:
    # 一致したパターンを空白区切りですべて表示
    for r in results:
        print r,
        print ""
    else:
        print "no match"

re.findall() の結果は「各要素が文字列のリスト」ですが、同様の処理をして「各要素がマッチオブジェクトのイテレータ」を返す re.finditer() という関数もあります。ニーズにあわせて使い分けるとよいでしょう。


re.split()

re.split() は分割のための関数です。指定した正規表現パターンを区切り文字にしてテキストを分割します。結果はリストで返ってきます。

こんな感じです。
sentences = re.split(r"\W", text)

print sentences
# => text をアルファベットと数字以外のすべての文字を区切り文字にして分割したリスト


re.sub()

re.sub() は置換のための関数です。正規表現パターンと一致する部分を別の文字列に置換した文字列を返します。

こんな感じです。
text_replaced = re.sub(r"\w+d", "***", text)

print text_replaced  # => d で終わる単語がすべて *** に置換された文字列

デフォルトでは、一致したパターンがすべて置換されて返ってきます。

置換する最大数を指定したい場合はキーワード引数 count を使います。
text_replaced = re.sub(r"\w+d", "***", text, count=3)

こうすると、 count に指定した数値を上限回数として置換してくれます。


以上です。

今回は 4 つの関数を見てみました。

  • re.search(): パターンを検索する。マッチは個数は 1 つだけ。
  • re.findall(): パターンを検索する。複数個マッチできる。
  • re.split(): パターンで分割する。
  • re.sub(): パターンを置換する。

これらの他にも、正規表現オブジェクトを生成できる関数 re.compile() や各種オプションなど、正規表現がらみの便利な機能が re には豊富に用意されています。

詳しく知りたい場合は、以下の参考ページなどを参照してみてください。


参考
Python Regular Expressions - Educational Materials — Google Developers
Regular Expressions in Python. Python Tutorials.
Regular Expression HOWTO — Python公式ドキュメント

Pythonでの正規表現の簡単なまとめ - minus9dの日記
正規表現 (Regular Expression) - Python 入門

追記20141009
参考リンクの Google Developers のページを日本語訳されている方がいるということでコメントをいただきました。こちらもよろしければ。
Python の正規表現 - 手習い録

2 件のコメント:

M Endo さんのコメント...

いつもBlog見てます。
Google Developersの参考リンクについてなんですが、日本語訳をされてる方のページを見つけましたのでよかったらご参考までに
s5.cocolog-nifty.com/blog/gpc-index-j.html

ゴトウハヤト さんのコメント...

ページご紹介いただきありがとうございます!