我有一个像这样的todo.txt列表,用换行符分隔:
(D) 2015-02-18 XDA Ultimate guide to +Tasker @Phone @Computer
2015-02-18 Redesign the business card for +RepairWork @Computer
(A) 2015-02-17 +Study how to +Ask questions @Computer @Phone
(B) 2015-03-25 Update +LaundryTimer W/ new popup design +Tasker
我有正则表达式来捕获+ Projects和@Contexts:
## Projects
project_matches = re.findall('[+]\D\w+',todo_list)
print list(set(project_matches))
## Contexts
context_matches = re.findall('[@][A-Z]\w+',todo_list)
print list(set(context_matches))
但我还希望通过+ Project或@Context快速有效地捕获每个任务和组。
例如,这是所需的输出:
Phone:
(A) 2015-02-17 +Study how to +Ask questions @Computer @Phone
(D) 2015-02-18 XDA Ultimate guide to +Tasker @Phone @Computer
Computer:
(D) 2015-02-18 XDA Ultimate guide to +Tasker @Phone @Computer
2015-02-18 Redesign the business card for +RepairWork @Computer
Tasker:
(D) 2015-02-18 XDA Ultimate guide to +Tasker @Phone @Computer
(B) 2015-03-25 Update +LaundryTimer W/ new popup design +Tasker
等等...
我还有正则表达式在找到项目或上下文时捕获任务,但我不知道它是否有帮助:(.*)(?=[+]\D\w+)(.*)
答案 0 :(得分:2)
你可以建立一些词典。 defaultdict
可以更轻松地使用list
启动每个项目。
import collections
projects = collections.defaultdict(list)
contexts = collections.defaultdict(list)
with open('todo_list.txt') as todo_list:
for line in todo_list:
for item in re.findall(r'[+]\D\w+', line):
projects[item].append(line)
for item in re.findall(r'[@][A-Z]\w+', line):
contexts[item].append(line)
如果您已将整个文件读入单个字符串,请使用splitlines()
遍历每一行:
import collections
projects = collections.defaultdict(list)
contexts = collections.defaultdict(list)
for line in todo_list.splitlines():
for item in re.findall(r'[+]\D\w+', line):
projects[item].append(line)
for item in re.findall(r'[@][A-Z]\w+', line):
contexts[item].append(line)
答案 1 :(得分:0)
您可以使用^.*word.*$
含义:从字符串^
开头,任意数字.
匹配任意次数*
,然后匹配一个单词。多次匹配任何字符.*
,直到行$
要完成任务,您可以执行类似
的操作tasks = re.findall(r"(^.*?%s.*?$)" % context, todo_list, re.MULTILINE)
其中context
是您正在寻找的单词(电话,计算机,Tasker等)
修改:re.MULTILINE
使re
匹配在每一行。它的作用类似于g
修饰符。您可以在此处查看我的示例:https://regex101.com/r/gS2yN9/1