【Python】正規表現を使った文字列検索

Python

Webのクローリングやスクレイピングでは文字列検索や文字列置換などを駆使するケースも多いかと思います。効率化を重視したいなら「正規表現」がどのようなものか知っておくことをおススメします。

正規表現

正規表現」という用語があります。 Wikipediaでは、

正規表現(せいきひょうげん、英: regular expression)とは、文字列の集合を一つの文字列で表現する方法の一つである。正則表現(せいそくひょうげん)とも呼ばれ、形式言語理論の分野では比較的こちらの訳語の方が使われる。まれに正規式と呼ばれることもある。

Wikipedia

と定義されています。ですが、、これだとちょっと分かりづらいのでもう少し簡単な例を。

「aaa」という文字列は、「a」が3回繰り返されているので「a{3}」と表現します。

という約束事を決めているとご理解ください。この約束事の集まりを正規表現と呼んでいます。 他にも「a」または「aa」または「aaa」という文字列は、「a+」(+は1回以上現れるという意味)と表現できますので、「aがたくさん並んでいる」という内容を明確に定義することができます。

正規表現を使った文字列検索

正規表現の特性を文字列検索に応用すると、欲しい文字列のみを取り出すことができます。 どのような時に使えるかというと、例えば特定の文章から日付だけを抜き取りたい場合などに便利です。 決まった文字列の検索でしたら、正規表現を使う必要はありませんが、形式は決まっている(例えば4桁の西暦の後に月と日付けが現れるという決まりがある場合など)ものの、その内容が都度変わる場合に威力を発揮します。

「abcdefg 2020/1/24 abcdefg 2020/1/1 abcdefg」という文字列のなかから、日付のみを取り出すには以下のように書きます。

>>> import re
>>> str = 'abcdefg 2020/1/24 abcdefg 2020/1/1 abcdefg'
>>> re.findall(r'(\d{4}/\d{1,2}/\d{1,2})', str)
['2020/1/24', '2020/1/1']

検索対象の文字列(str)のなかから、正規表現の条件に合致する文字列のみを抽出します。re.findall関数でマッチしたすべての文字列をリストで返しています。

\d{4}/\d{1,2}/\d{1,2}

この表現は、

  • 「\d」(0~9までの任意の数字)が4回現れ({4}で表現されます)、
  • その後に「/」が現れ、
  • 「\d」(0~9までの任意の数字)が1回か2回現れ({1,2}で表現されます)、
  • その後に「/」が現れ、
  • 「\d」(0~9までの任意の数字)が1回か2回現れる({1,2}で表現されます)

という文字列がマッチするかを探します。 ですので、例にある「2020/1/24」や「2020/1/1」はマッチします。ですが、「999/1/1」という文字列はマッチしません(999は4つの数字ではないため)。

厳密に日付を検索する場合は、形式などを改めて精査す必要がありますが、現実にはなかなか999年といった日付を目にすることもありませんので、困ることはありません。

応用編

re.search関数(最初の1回のみマッチ)とgroup関数を使った例です。取り出した日付文字列をdatetimeオブジェクトに変換して、、などで使うことが多いです。

>>> import re
>>> str = 'abcdefg2020/1/24abcdefg2020/1/1abcdefg'
>>> m = re.search(r'(?P<dstr>(\d{4}/\d{1,2}/\d{1,2}))', str)
>>> print m.group('dstr')
2020/1/24

コメント

タイトルとURLをコピーしました