『時刻』の正規表現つくってみた
結論
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を使って『時刻』の正規表現をつくってみました。
日付や時刻、金額といった、ある程度パターンが決まった文字列は正規表現との相性が良いです。
色々な文字列を正規表現で取り出してみて下さい。
Author And Source
この問題について(『時刻』の正規表現つくってみた), 我々は、より多くの情報をここで見つけました https://qiita.com/shoku-pan/items/54374c00e3ea39d6be7c著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .