我有一個文本中的持續時間串列,例如,['142 Days 16 Hours', '128 Days 9 Hours 43 Minutes', '10 Minutes']
我需要構建一個函式來獲取這些持續時間,而不是得出總天數。
特定文本可以是一天、幾天和小時、小時和分鐘、一組分鐘或一天、小時和分鐘。
我嘗試了以下方法:
def parse_dates(data):
days = int(re.match(r'\d \sDay', data)[0].split(' ')[0]) if re.match(r'\d \sDay', data) is not None else 0
hours = int(re.match(r'\d \sHour', data)[0].split(' ')[0]) if re.match(r'^\d Hour*s$', data) is not None else 0
minutes = int(re.match(r'\d \sMinute', data)[0].split(' ')[0]) if re.match(r'\d \sMinute', data) is not None else 0
days = hours / 24
days = minutes / 1440
return days
無論使用re.match()or re.search(),提供的函式都會失敗,這讓我相信運算式本身存在問題。
但是,小時和分鐘總是顯示為 0。如何修復regex或設計更好的解決方案來正確決議這些檔案?
uj5u.com熱心網友回復:
您可以嘗試以下正則運算式(Demo):
(?:(\d ) Days?)?(?: ?(\d ) Hours?)?(?: ?(\d ) Minutes?)?
解釋:
(?:...)標記非捕獲組(...)標記捕獲的組?在符號或組之后表示它是可選的\d表示一位或多位數字 (0123...)
示例 Python 實作:
import re
_DHM_RE = re.compile(r'(?:(\d ) Days?)?(?: ?(\d ) Hours?)?(?: ?(\d ) Minutes?)?')
_HOURS_IN_DAY = 24
_MINUTES_IN_DAY = 60 * _HOURS_IN_DAY
def parse_dates(s: str) -> int:
m = _DHM_RE.search(s)
if m is None:
return 0
days = int(m.group(1) or 0)
hours = int(m.group(2) or 0)
minutes = int(m.group(3) or 0)
days = hours / _HOURS_IN_DAY
days = minutes / _MINUTES_IN_DAY
return int(days)
strings = """\
142 Days 16 Hours
128 Days 9 Hours 43 Minutes
10 Minutes
52 Hours
""".splitlines()
for s in strings:
d = parse_dates(s)
print(f'{s!r} has {d} days.')
uj5u.com熱心網友回復:
這是一種方法:
import re
a = ['142 Days 16 Hours', '128 Days 9 Hours 43 Minutes', '10 Minutes']
def parse_dates(data):
x = [re.search('(\d )\s' unit, data) for unit in ['Day', 'Hour', 'Minute']]
x = [0 if y is None else int(y.group(1)) for y in x]
return x[0] x[1] / 24 x[2] / 1440
[print(parse_dates(data)) for data in a]
輸出:
142.66666666666666
128.4048611111111
0.006944444444444444
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/512207.html
