我应该如何接受查询字符串中的持续时间?

时间:2017-02-06 16:51:31

标签: python string python-2.7 time

我有一个带有Python和Flask的小型REST API,对于一些GET请求,我需要接受一个后视持续时间参数,例如: "一个月,B天,C小时,D分钟"。

此参数将从查询字符串中解析,但我有点不确定如何构建查询字符串以进行解析。除了后视之外,查询字符串中还有其他字段,这使得事情变得复杂。

我提出了两个主要选择。

  1. 接受查询字符串中的后视单个字段,例如: "8months5days",然后为传递的字符串扩展一些正则表达式解决方案,如virhilo's here

    regex = re.compile(r'((?P<hours>\d+?)hr)?((?P<minutes>\d+?)m)?((?P<seconds>\d+?)s)?')
    

    之后我可以从结果中构造datetime.timedelta

  2. 在我的查询字符串中为持续时间的不同组件接受多个字段,例如"behind_m=8&behind_d=5"。然后使用urllib获取完整查询字符串的字典

    query_d = parse_qs(request.query_string)
    

    最后将query_d

    之类的字典交叉
    durations = {'behind_m': 'months', 'behind_d': 'days', 'behind_y': 'years', ...}
    

    之后我可以直接构建datetime.timedelta

  3. 我的自然倾向是选择第二种选择,因为我对正则表达式很弱,我喜欢清晰度。但是,我最终可能会在某些查询字符串中要求多个持续时间,这在某些情况下会导致查询字符串非常长。

    有没有一种很好的方法来实现这一点,那就是正则表达式?我知道如果有一种干净的方法来解析某些字符串格式的持续时间,整个任务会更简单,但是尽管看了datetimedateutil我还没有找到任何支持持续时间解析。

1 个答案:

答案 0 :(得分:0)

我选择的工具是URI中的逗号分隔列表:

SET @average=(SELECT AVG(weight()) avg_rank FROM common WHERE  match('query text') OPTION ranker=expr('sum(word_count)*100 + sum(lcs*user_weight)*100 + bm25 + sum(exact_order)*200');

SELECT *, weight() as rank, 2000 * exp( - 9.594E-5 * abs(1486121357 - _rank_date)/1000) AS date_rank, IF(_importance > @average,_importance,0) AS importance_rank, (rank + date_rank + importance_rank) as total_rank FROM common WHERE match('query text') OPTION ranker=expr('sum(word_count)*100 + sum(lcs*user_weight)*100 + bm25 + sum(exact_order)*200')

解析为:

?behind=2,1,20,1,23,3

基于常见用例(如果您输入更长的持续时间或更短的持续时间),我决定采用格式durations = {'years': 2, 'months': 1, 'days': 20, hours: 1, minutes: 23, seconds: 3} 还是反过来。

要构建此year,months,days,hours,minutes,seconds,您可以dict字符串并将其放入字典中:

split