如何使用 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 之间的任何数字表示。
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP