如何使用 Python 正則表示式匹配日期字串?


簡介

程式語言 經常使用日期輸入來獲取使用者資料,例如出生日期、旅行日期、預訂日期等。可以使用正則表示式立即驗證使用者提供的這些日期是否有效。為了確定文字是否具有有效的日期格式,並從字串中提取有效日期,請使用正則日期表示式。

在檢查日期時,日期的正則表示式(YYYY-MM-DD)應查詢表示式開頭的四個數字、一個連字元、介於 01 和 12 之間的兩位數月份、另一個連字元,然後是介於 01 和 31 之間的兩位數日期。這就是正則表示式程式碼的工作原理 -

/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/

此程式碼支援大多數日期;但是,不包括錯誤的日期,例如 2021-04-31 和 2021-02-29(因為 2021 年不是閏年)(4 月只有 30 天)。使用您選擇的程式語言提供的工具執行這些測試。

日期格式標準和演算法

根據國際日期標準 ISO 8601,應使用的通用日期格式為 YYYY-MM-DD,易於人們和計算機閱讀。按時間順序排列這種型別非常簡單。

演算法

  • 匯入 re
  • 儲存日期字串
  • 使用 re.match 匹配日期字串
  • 列印 str.group()

ISO 標準也接受較短的格式 YYYYMMDD,我們將在稍後探討。因此,讓我們建立一個滿足這些要求的正則表示式。

使用的語法

日期必須以四位數的年份開頭,範圍從 0000 到 9999。這可以透過使用以下內容來解釋 -

/\d{4}/

量詞“4”指定我們想要正好四個字元,但數字字元“d”接受 0 到 9 的任何數字。(不多不少)。

/\d{4}-/

後面跟著兩位數的月份,如有必要,用前導零填充,範圍從 01 到 12。在此處使用“d2”(表示兩位數)可能會很誘人,但 00 到 99 之間的任何月份表示形式都是可以接受的。

示例

#importing re functions import re #storing the value of datestring in a variable datestring = '31-08-2022' #use re.match() functions to match the datestring str =re.match('(\d{2})[/.-](\d{2})[/.-](\d{4})$', datestring) #printing the str.group() print ("The first input date string is", str.group()) #again declaring the datestring variable with different date format datestring = '2022-08-31' #matching the datestring with re.match() functions. str=re.match('(\d{2})[/.-](\d{2})[/.-](\d{4})$', datestring) #printing the str print ("Matching both the date input if it's in the same format or not:", str)

輸出

The first input date string is 31-08-2022
Matching both the date input if it's in the same format or not: None

程式碼解釋

/0[1-9]/

括在方括號中的 1-9 表示我們將採用 1 到 9 的任何數字,但前面的 0 表示我們想要 0 字元的字面匹配。

對於以 1 開頭的月份(10 月(10)到 12 月(12)),我們有略微不同的佈局。只能跟隨一個字元 0 或 1 或 2 個字元。我們的做法如下 -

/1[0-2]/

方括號中的 0-2 將接受 0 到 2 的一個字元,而前面的 1 表示一個字元的字面匹配。

可以使用管道字元(|)或 OR 符號(|)組合這兩個月份表示形式,並且我們可以將它們括在圓括號中以表明它們作為一個單元工作。

/(0[1-9]|1[0-2])/

將其新增到我們的四位數年份正則表示式中,得到以下結果 -

/\d{4}-(0[1-9]|1[0-2])/

然後緊跟著另一個連字元字元 (-) -

/\d{4}-(0[1-9]|1[0-2])-/

最後,如果需要,我們可以構建將獲取兩位數日期表示形式的程式碼,用前導零填充,範圍從 01 到 31。我們將像表示月份一樣,將日期分成兩半。

我們將首先關注第 1 天到第 9 天,它們以 0 開頭。這些後面可以跟 1 到 9 的任何一位數字(注意,我們省略了數字 0,因為它不是有效的日期表示形式;見下文) -

/0[1-9]/

然後,透過說明我們可以有 1 或 2 後跟 0 到 9 的任何一個數字,我們將組合第 10 天到第 19 天和第 20 天到第 29 天 -

/[12][0-9]/

方括號 [12] 表示將接受 1 或 2。

此外,我們需要數字 3 後跟 0 或 1,以表示第 30 天到第 31 天。

/3[01]/

現在我們已經將這三個日期表示形式括在圓括號中並使用 OR 字元(|)分隔它們,我們可以將它們組合如下 -

/(0[1-9]|[12][0-9]|3[01])/

最後,我們可以透過繼續使用我們的表示式將它們重新組合 -

/\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])/

我們需要在表示式的開頭和結尾分別放置字串開頭字元和字串結尾字元,以確保我們只匹配日期,而不是其之前或之後的任何其他內容 -

/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/

就是這樣!憑藉一些巧妙的設計,此正則表示式程式碼將接受 YYYY-MM-DD 日期格式。

結論

Python 正則表示式 可以明確地找到具有日期、月份和年份格式的日期。日期是一位整數或零後跟一位整數、一位整數、兩位整數、三位整數或一位整數。月份是一位整數、零後跟一位整數、1 後跟 0、1 或 2,或 2 後跟 0。年份由數字 20 和 00 到 99 之間的任何數字表示。

更新於: 2023年11月2日

6K+ 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.