次の正規表現ルールを理解しようとしています。
import re
time_format = r"(?:(?P<weeks>\d+)\W*(?:weeks?|w),?)?\W*(?:(?P<days>\d+)\W*(?:days?|d),?)?\W*(?:(?P<hours>\d+):(?P<minutes>\d+)(?::(?P<seconds>\d+)(?:\.(?P<microseconds>\d+))?)?)?"
time_matcher = re.compile(time_format)
time_matches = time_matcher.match(td_str)
このルールを設定td_str = '0:10'
すると、次の結果が得られます。
{'days': None,
'hours': '0',
'microseconds': None,
'minutes': '01',
'seconds': None,
'weeks': None}
設定td_str = '0:0:10'
すると、次の結果が得られます。
{'days': None,
'hours': '0',
'microseconds': None,
'minutes': '0',
'seconds': '01',
'weeks': None}
0:10
正規表現ルールを変更して、0分+ 10秒として解釈されるようにするにはどうすればよいですか?さらに、「1:20:1」は、1時間+20分+1秒として解釈する必要があります。
したがって、(正規表現を理解している限り)作成したい正規表現ルールは次のとおりです。[H:[M:]]S
EDIT1:私は正しいルールを作成したと思います[M:]S
:
time_format = r"((?P<minutes>\d+)?:?)(?P<seconds>\d+)"
これが正しい方法であることを誰かが確認できますか?
EDIT2: Edit1に示されているルールを拡張すると、次のように機能します(場合によっては)。
time_format = r"((((?P<hours>\d+)?:?)(?P<minutes>\d+))?:?)(?P<seconds>\d+)"
ただし、私が言うとtime='1:10'
、これは1分10秒ではなく、1時間1分0秒に誤って変換されます。
EDIT3:これは、正規表現を使用せずに、今のところ問題を解決した方法です。正規表現を使用して同じことを実現する方法を知りたいです。
# defaults
days = 0
hours = 0
minutes = 0
seconds = 0
microseconds = 0
split_fields = time_string.split(':')
nbr_fields = len(split_fields)
if nbr_fields == 0: # should never happen
pass
if nbr_fields == 1:
seconds = int(split_fields[0])
elif nbr_fields == 2:
minutes = int(split_fields[0])
seconds = int(split_fields[1])
elif nbr_fields == 3:
hours = int(split_fields[0])
minutes = int(split_fields[1])
seconds = int(split_fields[2])
else: # in case there's more than 3 fields ...
hours = int(split_fields[-3])
minutes = int(split_fields[-2])
seconds = int(split_fields[-1])