如何使用 Python 正则表达式从文本中提取日期?
我们必须首先了解一些正则表达式基础知识,因为我们将使用它们。有多种方法可以在正则表达式中声明模式,这可能会使它们看起来很复杂,但实际上非常简单。正则表达式是可用于匹配遵循该模式的字符串的模式。您需要阅读以下文章以了解正则表达式的工作原理。
在学习编码时,您通常可以从给定的文本中提取日期。如果您正在自动化 Python 脚本并需要从 CSV 文件中提取特定的数字,如果您是数据科学家并需要从给定的模式中分离复杂的日期,或者如果您是想要了解更多有关字符串和数字数据类型的 Python 爱好者,您无疑会发现这篇文章很有帮助。
希望您熟悉正则表达式基础知识。
示例 1
仅使用基本符号来创建日期的正则表达式模式。我们的目标是匹配包含元素日、月、年或日、月和年的日期,其中元素日和月有两位数字,元素年有四位数字。现在让我们一点一点地构建模式。
正如您所猜测的,d 将匹配数字。我们需要提供其中的数字 2 来匹配恰好有 2 位数字的字符串。因此,"d2"将匹配任何只有 2 位数字的字符串。日、月和年的模式分别为 d2、d2 和 d4。这三个必须用"/"或"-"连接在一起。
最新的正则表达式模式是"d2",后跟"d2"和"d4"。
现在有问题的部分已经完成,剩下的任务就很容易了。
输入 1
import re #Open the file that you want to search f = open("doc.txt", "r") #Will contain the entire content of the file as a string content = f.read() #The regex pattern that we created pattern = "\d{2}[/-]\d{2}[/-]\d{4}" #Will return all the strings that are matched dates = re.findall(pattern, content)
需要注意的是,我们的正则表达式模式也会提取不合法的日期,例如 40/32/2019。最终代码必须修改为如下所示:
输入 2
import re #Open the file that you want to search f = open("doc.txt", "r") #Will contain the entire content of the file as a string content = f.read() #The regex pattern that we created pattern = "\d{2}[/-]\d{2}[/-]\d{4}" #Will return all the strings that are matched 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()
输入文本
例如,如果文本文件的内容如下
My name is XXX. I was born on 07/12/2001 in YYY city. I graduated from ZZZ college on 07-28-2019.
输出
07/04/1998 09-05-2019
示例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)
输出
2002-07-28
结论
通过上述对话,我们发现了各种用于从给定文本中提取日期的 Python 函数。不过,regex 模块无疑是我们个人的最爱。您可能会反驳说,其他方法(例如 split() 函数)可加快执行速度,并生成更直接、更易理解的代码。但是,如前所述,它不会产生负值(关于方法 2),也不适用于浮点数与其他字符之间没有空格的情况,例如"25.50k"(关于方法 2)。此外,在日志解析方面,速度本质上是一个无用的统计数据。现在您可以理解为什么在这个列表的所有选项中,regex 是我的个人偏好。