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