如何使用 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 表示 1 字元的字面匹配。

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

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

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

/\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.