从todolist项目的字符串中获取任务

时间:2018-04-03 17:45:38

标签: python python-3.x

我正在尝试使用一个函数来返回要执行的任务(对于一个todolist项目),该函数将某些字符串作为参数... 事实上,Iam试图在python 3中编写这个https://github.com/todotxt/todo.txt

所以基本上我有一个我必须填写的词典:•优先级(从最高优先级到Z最低优先级)

•'x'任务是否已完成

•查找并填写完成日期和创建日期(YYYY-MM-DD)

•找到以'@'开头的上下文并更新dict

•找到以“+”开头并更新字典的项目..

•文件中任务的N顺序..(稍后会看到)

•最后没有这些的字符串是任务,所以我用这个任务更新dict并返回它...

到目前为止,这是我的Python代码:

def parser_task(line):

    """
    :param:(str) a line
    :return: (dict) dict representing the task to do
    :Contraints: None?

    Examples:

    >>> parser_task('x (A) 2018-03-02 2018-03-04 do you homeworks +studies @home')
    {'text': 'do your homeworks'}
    >>> parser_task('Call mom (A) @ phone @sededay')
    {'text': 'Call mom'}
    >>> parser_task('X 2019-01-01 wish happy new year to everyone')
    {'text': 'wish happy new year to everyone'}

    """
    dict = { 
                'N': '',
                'X':'',
                'completionDate':'',
                'creationDate':'',
                'priority':'',
                'context':'',
                'project':'',
                'text':''
            }
    liste_prioritie = [chr(k) for k in range(ord("A"),ord("Z"))]

    ligne_decouped = ligne.split(' ')

    for i in range(len(ligne_decouped)):
        if '(' in ligne_decouped[i]:
            a = ligne_decouped[i]
            for char in ligne_decouped[i]:
                if char == "(":
                     a = a.replace(char,"")
                if char == ")":
                     a = a.replace(char,"")
            dict['priority'] = a
            del ligne_decouped[i]
        if 'x' == ligne_decouped[i]:
            dict['X'] = ligne_decouped[i]
            del ligne_decouped[i]
        if '-' in ligne_decouped[i]:
            dict['creationnDate'] = ligne_decouped[i]
            del ligne_decouped[i]
        if '-' in ligne_decouped[i]:
            dict['completionDate'] = ligne_decouped[i]
            del ligne_decouped[i]
        if '+' in ligne_decouped[i]:
            dict['project'] = ligne_decouped[i]
            del ligne_decouped[i]
        if '@' in ligne_decouped[i]:
            dict['context'] = ligne_decouped[i]
            del ligne_decouped[i]
    return ligne_decouped

我一直在if '(' in line_decouped[i]:

中使列表索引超出范围

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

我强烈推荐regex执行此任务(BTW,仍然不确定您打算在词典中分配给N)。以下内容适用于您提供的示例,但是如果没有多个示例,则无法保证适用于您的所有情况:

import re

def parser_task(ligne):

    ligne_decouped = { 
                'N': '',
                'X':'',
                'completionDate':'',
                'creationDate':'',
                'priority':'',
                'context':'',
                'project':'',
                'text':''
            }

    dates = re.findall(r'\d{4}\-\d{2}\-\d{2}', ligne)
    ligne_decouped['creationDate'] = dates[0]
    ligne_decouped['completionDate'] = dates[1]
    ligne_decouped['priority'] = re.search(r'\(([A-Z])\)', ligne).group(1)
    ligne_decouped['context'] = re.search(r'(?<=@)(.*)$', ligne).group(1)
    ligne_decouped['X'] = re.search(r'^(.)', ligne).group(1)
    ligne_decouped['project'] = re.search(r'(?<=\+)(\S+)', ligne).group(1)
    ligne_decouped['text'] = re.search(dates[1] + r'\s+(.*?)\s+\+', ligne).group(1)
    return ligne_decouped

print(parser_task('x (A) 2018-03-02 2018-03-04 do you homeworks +studies @home'))

收率:

{
'N': '',
'X': 'x',
'completionDate': '2018-03-04',
'creationDate': '2018-03-02',
'priority': 'A',
'context': 'home',
'project': 'studies',
'text': 'do you homeworks'
}