如何使用Python正则表达式从文本中提取日期?

如何使用Python正则表达式从文本中提取日期?

我们必须先了解一些正则表达式的基础知识,因为我们将使用它们。正则表达式有多种声明模式的方法,这可能会使它们看起来很复杂,但实际上它们很简单。正则表达式是模式,可用于匹配符合该模式的字符串。您需要阅读以下文章以了解正则表达式运作方式。

当学习编程时,您可能通常会从给定的文本中提取日期。如果您正在自动化Python脚本并需要从CSV文件中提取特定的数字数据,如果您是数据科学家并需要从给定模式中分离出复杂的日期,或者如果您是Python爱好者,想要了解有关字符串和数字数据类型的更多信息,您肯定会发现这篇有用的文章。

预计您将熟悉正则表达式的基础知识。

阅读更多:Python 教程

示例1

只使用基本符号创建正则表达式模式来匹配日期。我们的目标是匹配具有日、月、年或日、月和年元素的日期,其中日和月的元素有两个数字,年的元素有四个数字。现在让我们逐步构建模式。

d将匹配数字,正如您所料。我们需要在其中提供数字2,以匹配只有2个数字的字符串。因此,d2将匹配仅具有2个数字的任何字符串。日、月和年的模式分别为d2、d2和d4。这三个必须用’/’或’-‘连接起来。

最新的正则表达式模式是“d2”后跟“d2”和“d4”。

现在麻烦的部分已经完成,剩下的任务变得容易。

如何使用Python正则表达式从文本中提取日期?

输入1

import re

#打开要搜索的文件
f=open("doc.txt", "r")

#将文件的所有内容作为字符串包含
content = f.read()

#我们创建的正则表达式模式
pattern = "\d{2}[/-]\d{2}[/-]\d{4}"

#将返回所有匹配的字符串
dates = re.findall(pattern, content)
Python

应该注意,我们的正则表达式模式也会提取不合法的日期,例如40/32/2019。必须对最终代码进行修改,如下所示:

输入2

import re

#打开要搜索的文件
f = open("doc.txt", "r")

#将文件的所有内容作为字符串存储在变量中
content = f.read()

#创建正则表达式匹配模式
pattern = "\d{2}[/-]\d{2}[/-]\d{4}"

#返回所有匹配的字符串
dates = re.findall(pattern, content)

for date in dates:
   if "-" in date:
      day, month, year = map(int, date.split("-"))
   else:
      day, month, year = map(int, date.split("/"))
   if 1 <= day <= 31 and 1 <= month <= 12:
      print(date)
f.close()
Python

输入文本

例如,如果文本文件的内容如下所示

我的名字是XXX。我的出生日期是07/12/2001,出生在YYY城市。
我于07-28-2019ZZZ学院毕业。
Python

输出

07/04/1998
09-05-2019
Python

示例2

import datetime
from datetime import date
import re
s = "Jason's birthday is on 2002-07-28"
match = re.search(r'\d{4}-\d{2}-\d{2}', s)
date = datetime.datetime.strptime(match.group(), '%Y-%m-%d').date()
print (date)
Python

结果

2002-07-28
Python

结论

通过以上谈话,我们发现了从给定文本中提取日期的各种Python函数。 正则表达式模块无疑是我们个人最喜欢的方法。 您可能会反驳说,诸如split()函数之类的替代方法会导致更快的执行和更简单,更易于理解的代码。但是,如前所述,它不能产生负值(关于方法2),也不能应用于没有它们和其他字符之间的空格的浮点数,例如“25.50k”(关于方法2)。此外,速度在日志解析方面实际上是无用的统计数据。您现在可以理解,为什么在此列表中所有选项中,正则表达式是我个人的首选。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册