获取与python匹配正则表达式的文本

时间:2015-12-18 02:01:43

标签: python regex

我有一个像这样的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+)(.*)

2 个答案:

答案 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