亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

編寫正則表達式以捕獲許多不同的日期格式

編寫正則表達式以捕獲許多不同的日期格式

九州編程 2021-08-24 17:02:39
我正在嘗試編寫一個正則表達式,它將捕獲以下時間格式:H:MM HH:MM以及 PM 或 PM 的變化,在時間之后或在時間之后有一個空格,或在小寫中,或用 AM 代替(希望你明白)。作為一些例子:1:00PM, 1:00pm, 1pm, 1PM, 1:00 PM, 1:00pm, 2:00這是我目前擁有的正則表達式:([0-9]|0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9])?(( )?(PM|AM|am|pm|a.m|p.m|P.M|P.M|a.m.|p.m.|P.M.|A.M.))?但是,在為我的所有格式工作時,它還會捕獲所有其他整數,我不知道如何解決這個問題。為了解決這個問題,我寫了 2 個單獨的,一個捕捉時間:([0-9]|0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9])一個只用 PM/AM 位捕獲時間:([0-9]|0[0-9]|1[0-9]|2[0-3])(:[0-5][0-9])?(( )?(PM|AM|am|pm|a.m|p.m|P.M|P.M|a.m.|p.m.|P.M.|A.M.)){1,2}但理想情況下,我想要一個表達式,但是我所有的嘗試都導致了與本文開頭的正則表達式相似的結果。
查看完整描述

3 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

您可以使用此正則表達式:

\d{1,2}:\d{2}(\s*[ap]\.?m\.?)?

說明:

  • \d{1,2} 將匹配 1 或 2 位數字(小時)。

  • :將匹配文字:

  • \d{2} 將匹配精確的 2 位數字(分鐘)。

  • (\s*[ap]\.?m\.?)?: 要么匹配要么\s*[ap]\.?m\.?不匹配,因為?后面的括號?,F在,讓我們分解\s*[ap]\.?m\.?一下:

    • \s*將匹配零個或多個空格。\s對于空白,以及*零個或多個。

    • [ap]將期望ap。

    • \.?將匹配文字.?使其成為可選的。請注意,.在正則表達式中匹配任何內容,并且要匹配實際 dot .,您必須執行\.

    • m 會期待一個 m

    • \.? 再次將匹配一個可選的 .

為了不區分大小寫,您可以使用IGNORECASE標志編譯此正則表達式:

import re
r = re.compile(r'\d{1,2}:\d{2}(\s*[ap]\.?m\.?)?', re.IGNORECASE)


查看完整回答
反對 回復 2021-08-24
?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

我知道你特別要求使用正則表達式,但如果我沒有指出dateutil解析器是在考慮某種事情的情況下編寫的,那我就失職了。(當然取決于你的最終目標)


它在獲取奇怪的日期/時間/日期時間字符串并將它們轉換為日期時間對象方面做得非常好。


from dateutil.parser import parse


times = [ "1:00PM", "1:00pm", "1pm",  "1PM", "1:00 PM", "1:00 AM", "1:00pm", "2:00"]


for t in times:

    x = parse(t)

    print(f"{x} <--> {t}")

輸出:


2018-11-21 13:00:00 <--> 1:00PM

2018-11-21 13:00:00 <--> 1:00pm

2018-11-21 13:00:00 <--> 1pm

2018-11-21 13:00:00 <--> 1PM

2018-11-21 13:00:00 <--> 1:00 PM

2018-11-21 01:00:00 <--> 1:00 AM

2018-11-21 13:00:00 <--> 1:00pm

2018-11-21 02:00:00 <--> 2:00


查看完整回答
反對 回復 2021-08-24
  • 3 回答
  • 0 關注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號