如何使用 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.