在 Python 中,如何从还包含其他单词的字符串中解析日期时间

In Python, how to parse a datetime from a string which also contains other words

我熟悉 dateutil.parser which allows one to parse a string representing a time into a datetime 对象。但是,我想做的是 'search' 在表示时间间隔的较大字符串中这样的 'time string' 。例如:

from datetime import timedelta
import dateutil.parser
import parse

start = dateutil.parser.parse("5 Nov 2016 15:00")
end = start + timedelta(hours=1)

string = "from {start} till {end}".format(start=start, end=end)

start_pattern = "from {:tg}"
result = parse.search(start_pattern, string)

我想将 startend 恢复为 datetime 对象,因为它们遵循单词 "from" 和 "till" , 分别.

我在这里尝试使用 parse 模块,但格式说明符 :tg(用于全球时间语法)似乎不适用于 datetime 的默认字符串表示,其他可用的也与 string.

中的相似

在此示例中解析回 startend 的简单而优雅的方法是什么?

在这种情况下,re 软件包可以帮助您;只需为要匹配的字符串制作正则表达式,并使用它们来提取日期部分。

我找到了一种使用正则表达式的方法:

from datetime import timedelta
import dateutil.parser
import re

start = dateutil.parser.parse("5 Nov 2016 15:00")
end = start + timedelta(hours=1)

string = "from {start} till {end}".format(start=start, end=end)

pattern = '(?:\s*from\s*)' + '(?P<start>.+)' + '(?:\s*till\s*)' + '(?P<end>.+)' + '(?:\s*)'

groups = re.match(pattern, string).groupdict()

parsed_start = dateutil.parser.parse(groups['start'])
parsed_end = dateutil.parser.parse(groups['end'])

assert parsed_start == start
assert parsed_end == end