4 回答

TA貢獻1891條經驗 獲得超3個贊
您的正則表達式在前導數字之前強制執行一個空格,這會阻止,10:00 am
匹配,并且在無法匹配的冒號之前需要兩個數字7:00 pm
。r"(?i)(\d?\d:\d\d (?:a|p)m)"
似乎是最精確的選擇。
之后,使用格式字符串datetime.strptime
解析匹配并將其轉換為軍事。任何無效的時間都會引發一個很好的錯誤(如果您預計應該忽略的字符串,請調整正則表達式以嚴格匹配24 小時時間)。"%H:%M"
10:67
import re
from datetime import datetime
def to_military_time(x):
return datetime.strptime(x.group(), "%I:%M %p").strftime("%H:%M")
txt = "Mon - Fri:,10:00 am - 7:00 pm"
data = re.sub(r"(?i)(\d?\d:\d\d (?:a|p)m)", to_military_time, txt)
print(data) # => Mon - Fri:,10:00 - 19:00

TA貢獻1851條經驗 獲得超5個贊
為什么不使用時間模塊?
import time
data = "Mon - Fri:,10:00 am - 7:00 pm"
parts = data.split(",")
days = parts[0]
hours = parts[1]
parts = hours.split("-")
t1 = time.strptime(parts[0].strip(), "%I:%M %p")
t2 = time.strptime(parts[1].strip(), "%I:%M %p")
result = days + "," + time.strftime("%H:%M", t1) + " - " + time.strftime("%H:%M", t2)
輸出:
Mon - Fri:,10:00 - 19:00

TA貢獻1807條經驗 獲得超9個贊
您的正則表達式只查找兩位數小時 ( \d{2}
),前面有空格 ( \s
)。以下內容也捕獲一位數字小時,可能用逗號代替空格。
data = re.findall(r'[\s,](\d{1,2}\:\d{2}\s?(?:AM|PM|am|pm))', txt)
但是,您可能希望將所有標點符號視為有效:
data = re.findall(r'[\s!"#$%&\'\(\)*+,-./:;\<=\>?@\[\\\]^_`\{|\}~](\d{1,2}\:\d{2}\s?(?:AM|PM|am|pm))', txt)

TA貢獻1848條經驗 獲得超6個贊
正則表達式需要像這里一樣改變。
import re
text = 'Mon - Fri:,10:00 am - 7:00 pm'
result = re.match(r'\D* - \D*:,([\d\s\w:]+) - ([\d\s\w:]+)', text)
print(result.group(1))
# it will print 10:00 am
print(result.group(2))
# it will print 7:00 pm
你需要像 '+' 和 '*' 這樣的東西來告訴正則表達式得到多個單詞,如果你只使用 \s 它只會匹配一個字符。
您可以在此處了解更多正則表達式。
https://regexr.com/
在這里您可以在線嘗試正則表達式。
https://regex101.com/
添加回答
舉報