从字符串中删除识别的日期

时间:2018-07-17 14:50:39

标签: python date python-dateutil

作为输入,我有几个包含日期格式的字符串,例如

  • “彼得在 16:45 喝茶”
  • “我的生日是 1990年7月8日
  • “在 7月11日星期六,我会回家”

我使用dateutil.parser.parse来识别字符串中的日期。
在下一步中,我想从字符串中删除日期。结果应该是

  • “彼得在”喝茶
  • “我的生日在”
  • “我要回家了”

有没有简单的方法可以实现这一目标?

4 个答案:

答案 0 :(得分:1)

如果您定义了一个将字符串作为日期或不作为日期进行验证的函数,我们可以单行执行

primary_key = null

答案 1 :(得分:1)

您可以对dateutil.parser.parse使用fuzzy_with_tokens选项:

from dateutil.parser import parse

dtstrs = [
    "Peter drinks tea at 16:45",
    "My birthday is on 08-07-1990",
    "On Sat 11 July I'll be back home",
    ]

out = [
    parse(dtstr, fuzzy_with_tokens=True)
    for dtstr in dtstrs
]

结果:

[(datetime.datetime(2018, 7, 17, 16, 45), ('Peter drinks tea at ',)),
 (datetime.datetime(1990, 8, 7, 0, 0), ('My birthday is on ',)),
 (datetime.datetime(2018, 7, 11, 0, 0), ('On ', ' ', " I'll be back home"))]

fuzzy_with_tokens为true时,解析器返回一个datetime的元组和一个被忽略的标记的元组(已使用的标记已删除)。您可以将它们重新连接成这样的字符串:

>>> ['<missing>'.join(x[1]) for x in out]
['Peter drinks tea at ',
 'My birthday is on ',
 "On <missing> <missing> I'll be back home"]

我将注意到模糊解析逻辑并不是非常可靠,因为很难从字符串中仅选择有效组件并使用它们。例如,如果您将喝茶的人更改为名为April的人,

>>> dt, tokens = parse("April drinks tea at 16:45", fuzzy_with_tokens=True)
>>> print(dt)
2018-04-17 16:45:00
>>> print('<missing>'.join(tokens))
 drinks tea at 

因此,我强烈建议您使用这种方法(尽管我不能真正推荐一种更好的方法,但这只是一个难题)。

答案 2 :(得分:0)

您可以使用re.findall()方法查找日期,然后将其与字符串分开。 我认为下面的链接中的代码可以解决您的问题。

https://stackoverflow.com/a/2770062/9721027

答案 3 :(得分:0)

def remove_dates(sentence):
"""remove the dates like Mar 30  2013"""
sentence = re.sub('(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s\d{2}\s\d{4}', ' ', sentence)
return sentence

测试:

remove_dates(' good Mar 30 2013 day')

“美好的一天”