我有一些来自不同网站的文字,我想从中提取日期。可以想象,日期的格式大不相同,如下所示:
Posted: 10/01/2014
Published on August 1st 2014
Last modified on 5th of July 2014
Posted by Dave on 10-01-14
我想知道的是,如果有人知道Python库[或API]会对此有所帮助 - (除了例如正则表达式,这将是我的后备)。我可以相对容易地删除“摆在”部分,但让其他东西保持一致看起来并不容易。
答案 0 :(得分:2)
我使用dateutil的解决方案
根据Lukas的建议,我使用了dateutil包(似乎比Arrow更灵活),使用模糊条目,它基本上忽略了不是日期的东西。
使用dateutil模糊解析的注意事项
要注意的主要事项是,如线程Trouble in parsing date using dateutil中所述,如果它无法解析日/月/年,则需要一个默认值(除非另有指定,否则为当天),并且据我所知,没有报告标志表明它采用了默认值。
这将导致“随机文本”返回今天的2015-4-16日期,这可能会导致问题。
<强>解决方案强>
因为我真的想知道什么时候失败,而不是用默认值填写日期,我最终运行了两次,然后看看它是否在两个实例上都采用了默认值 - 如果没有,那么我假设正确解析。
from datetime import datetime
from dateutil.parser import parse
def extract_date(text):
date = {}
date_1 = parse(text, fuzzy=True, default=datetime(2001, 01, 01))
date_2 = parse(text, fuzzy=True, default=datetime(2002, 02, 02))
if date_1.day == 1 and date_2.day ==2:
date["day"] = "XX"
else:
date["day"] = date_1.day
if date_1.month == 1 and date_2.month ==2:
date["month"] = "XX"
else:
date["month"] = date_1.month
if date_1.year == 2001 and date_2.year ==2002:
date["year"] = "XXXX"
else:
date["year"] = date_1.year
return(date)
print extract_date("Posted: by dave August 1st")
显然这有点拙劣(所以如果有人有一个更优雅的解决方案 - 请分享),但这正确地解析了我上面的四个例子[它假定美国格式的日期为10/01/2014而不是比英国格式],并导致在输入缺失数据时适当地返回XX。
答案 1 :(得分:0)
您可以使用Arrow库:
arrow.get('2013-05-05 12:30:45', ['MM/DD/YYYY', 'MM-DD-YYYY'])
两个参数,首先是要解析的str,然后是要尝试的格式列表。