Python 如何使用正则表达式匹配日期字符串

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年不是闰年)(四月只有30天)。可以使用您选择的编程语言提供的工具来执行这些测试。

日期格式要求和算法

应使用的通用日期格式是YYYY-MM-DD,根据国际日期标准ISO 8601,同时适合人和计算机阅读,很容易按照时间顺序排列。

步骤

  • import 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到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之间的任何数字代表。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程