Преобразуйте список в Kanban -подобный YAML с помощью регулярного выражения - PullRequest
0 голосов
/ 13 февраля 2020

Данный текст имеет следующую структуру:

* Topic1 :
  - things to do blabla # Todo [20/02/2020]
  - things done blabla # Done [15/01/2020]

* Topic2 :
  - ....

Как мы можем его проанализировать, преобразовав этот список в kanban подобную структуру, т.е. что-то следующего вида:

Todo :
  - Action1 date
  ...
Done :
   - Action2

Мне удалось разделить статус действий с помощью следующего регулярного выражения: regex = r "- ([^ (# | \ n | [)] ) (# [^ [] ) ([. *]) "https://regex101.com/r/JHtWF2/1

Match 1
Full match  13-50   - things to do blabla #P [20/02/2020]
Group 1.    15-35   things to do blabla 
Group 2.    35-38   #P 
Group 3.    38-50   [20/02/2020]
Match 2
Full match  53-97   - things done blabla Done ed #A [15/01/2020]
Group 1.    55-82   things done blabla Done ed 
Group 2.    82-85   #A 
Group 3.    85-97   [15/01/2020]
Match 3
Full match  112-158 - trouver une regex qui marche #D [14/02/2020]
Group 1.    114-143 trouver une regex qui marche 
Group 2.    143-146 #D 
Group 3.    146-158 [14/02/2020]

Как включить строку" * Topi c "и включить другие" - "в качестве вложенной подгруппы в" * topi c "?

1 Ответ

0 голосов
/ 24 февраля 2020

Наконец я сделал это:

import re
import collections
import yaml

def t2k(file):
    with open(file)as f:
        txt=f.read()

    regex=r"(?sm)\* (.*?) :(\s+-.*?)(?=^\*|\Z)"
    regactions=r'  - ([^\#]*)(?P<status>#.) (\[.*])'

    # list of topics with action and status    
    topics=re.finditer(regex,txt,re.MULTILINE)


    # Initiate kanban liste
    list_kanban=[]


    for topic in topics:
        #parse action in topics
        actions=re.finditer(regactions,topic[2])
        for action in actions:
            # create a kanban for each action
            kanban={'topic':topic[1], 'actions':action[1]}
            list_kanban.append({action['status'][-1:]:kanban})


    # group list kanban by status    
    dict_kanban = collections.defaultdict(list)  
    for d in list_kanban:
        for k, v in d.items():
            dict_kanban[k].append(v)

    result=[]
    for statut in dict_kanban.keys():
        single_topic=[]
        topi_dict={}
        for d in dict_kanban[statut]:
            if d['topic'] not in single_topic:
                single_topic.append(d['topic'])
                topi_dict[d['topic']]=[d['actions']]
            else:
                topi_dict[d['topic']].append(d['actions']) 
        result.append({statut:topi_dict})
    #%%

    ff = open('PDCA.yaml', 'w+')
    yaml.dump(result, ff, allow_unicode=True, default_flow_style=False,sort_keys=False)
    print('-')
    print(result)
    return result

И вы используете это так:

import PDCA
PDCA.t2k('txt.md')
with open('PDCA.yaml') as f:
    print(f.read())

Уверен, это не самый питон c способ, но он делает свою работу , Следующим шагом будет создание живого веб-редактора, который преобразует PDCA kanban, когда вы делаете заметки .... Интересно, буду ли я использовать flexx или remi, но это другая история

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...