如何使用 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()
我们稍后将探讨的较短格式 YYYYMMDD 也被 ISO 标准接受。因此,让我们创建一个满足这些要求的正则表达式。
使用的语法
日期必须以四位数的年份开头,范围从 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])/
将其添加到我们的 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 之间的任意数字表示。