『時刻』の正規表現つくってみた


結論

pythonによる『時刻』の正規表現はこちらです。

pattern_date = r'((0?|1)[0-9]|2[0-3])[:時][0-5][0-9]分?'

# OK
# 1時10分
# 1:10
# 01:56
# 10:06
# 12:34

# NG
# 99:99

準備

環境はGoogle Colaboratoryを使用します。
Pythonのバージョンは以下です。

import platform
print("python " + platform.python_version())
# python 3.6.9

正規表現のチェックツールは以下を使用しました。
https://regex101.com/
こちらで確認しながら正規表現を作成し、コードに実装していきます。

また、Pythonの正規表現全般については、こちらがわかりやすいです。
https://qiita.com/luohao0404/items/7135b2b96f9b0b196bf3

時刻の正規表現をつくってみよう

早速コードを書いていきましょう。
まずは、正規表現を使うためのライブラリをインポートします。

import re

ではまず、
12:34
という文字列とマッチする正規表現をつくってみます。

pattern = r'12:34'

もちろん、これは完全一致なのでマッチします。
コードで確かめてみましょう。

pattern = r'12:34'
string = r'12:34'
prog = re.compile(pattern)
result = prog.match(string)
if result:
    print(result.group())
# 12:34 

マッチした文字列が表示されています。
以降は簡単のために、正規表現のpatternのみ記載します。

時刻には、「12:34」以外にも、「01:56」や「10:06」などがあります。
これらにもマッチする正規表現は以下です。

pattern = r'\d\d:\d\d'

使用した正規表現は以下です。

文字 説明
\d 任意の数字
マッチする文字列
\d\d 12, 34, 01, 56, 10, 06

上の正規表現は、もっと簡単に表すことができます。

pattern = r'\d{2}:\d{2}'

新たに使用した正規表現は以下です。

文字 説明
{m} 直前の文字のm回の繰り返し
マッチする文字列
\d{2} 12, 34, 01, 56, 10, 06

しかしこれでは、「99:99」といった、時刻としてありえない文字列もとってしまいます。

今回は、hh:mm形式として、以下の条件のみ許容することにします。

  • hh:00~23
  • mm:00~59

修正した正規表現は以下になります。

pattern = r'([01][0-9]|2[0-3]):[0-5][0-9]'

新たに使用した正規表現は以下です。

文字 説明
[abc] a,b,cのいずれかの文字
マッチする文字列
[01][0-9] 00~09, 10~19
つまり、00~19
2[0-3] 20~23
[0-5][0-9] 00~09, 10~19, …, 50~59
つまり、00~59

また、以下の正規表現も使用しました。

文字 説明
(abc|efg) abcもしくはefgのいずれかの文字列
マッチする文字列
([01][0-9]|2[0-3]) 00~19もしくは20~23
つまり、00~23

これで、上記の条件のみマッチする正規表現ができました。

しかしこれでは、「1:10」といった、0埋め(0パディング)されていないものはとれません。
修正した正規表現は以下になります。

pattern = r'((0?[0-9]|1[0-9])|2[0-3]):[0-5][0-9]'

新たに使用した正規表現は以下です。

文字 説明
? 直前の文字の0回または1回の繰り返し
マッチする文字列
0?[0-9] 0~9もしくは00~09

これは、以下のようにもう少し短く書くこともできます。

pattern = r'((0?|1)[0-9]|2[0-3]):[0-5][0-9]'

これで、0埋め(0パディング)なしのものにも対応できました。

さらに、「:(コロン)」だけでなく、「-(ハイフン)」や「時(分)」にもマッチするように修正しましょう。

pattern = r'((0?|1)[0-9]|2[0-3])[:時][0-5][0-9]分?'

まとめ

今回は、Pythonを使って『時刻』の正規表現をつくってみました。

日付や時刻、金額といった、ある程度パターンが決まった文字列は正規表現との相性が良いです。
色々な文字列を正規表現で取り出してみて下さい。