在 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)
我想将 start
和 end
恢复为 datetime
对象,因为它们遵循单词 "from" 和 "till" , 分别.
我在这里尝试使用 parse 模块,但格式说明符 :tg
(用于全球时间语法)似乎不适用于 datetime
的默认字符串表示,其他可用的也与 string
.
中的相似
在此示例中解析回 start
和 end
的简单而优雅的方法是什么?
在这种情况下,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
我熟悉 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)
我想将 start
和 end
恢复为 datetime
对象,因为它们遵循单词 "from" 和 "till" , 分别.
我在这里尝试使用 parse 模块,但格式说明符 :tg
(用于全球时间语法)似乎不适用于 datetime
的默认字符串表示,其他可用的也与 string
.
在此示例中解析回 start
和 end
的简单而优雅的方法是什么?
在这种情况下,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