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

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

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

当学习编码时,您可能经常从给定的文本中提取日期。如果您正在自动化一个Python脚本并且需要从CSV文件中提取特定的数字,如果您是一名数据科学家并且需要从给定的模式中分离复杂的日期,或者如果您是一个热衷于学习有关字符串和数字数据类型的Python爱好者,那么您无疑会发现这篇有用的文章。

预计您会熟悉正则表达式的基本知识。

示例1

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

d将匹配数字,就像您猜到的那样。我们需要在内部提供数字2来匹配确切有2位数字的字符串。因此,”d2″将匹配任何只有2位数字的字符串。天、月和年的模式分别为d2、d2和d4。这三个必须用’/’或’-‘连接在一起。

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

现在问题部分已经完成,剩下的任务就很容易了。

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

输入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函数。然而,正则表达式模块无疑是我们个人最喜欢的方法。你可能会反驳说,其他方法(如split()函数)执行速度更快、代码更简单易懂。然而,如前所述,这些方法不能处理负数(关于第二种方法),也无法处理没有空格的浮点数与其他字符混合的情况,例如”25.50k”(关于第二种方法)。此外,在日志解析中,速度几乎是一个无用的统计量。所以,现在你明白了为什么在这个列表中,正则表达式是我个人的首选了。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程