Python中的布尔搜索文本文件

时间:2016-01-26 11:12:48

标签: python

我有一篇包含32篇文章的文本文件。每篇文章都以表达式<Number> of 32 DOCUMENTS开头,例如:1 of 32 DOCUMENTS2 of 32 DOCUMENTS等。为了找到每篇文章,我使用了以下代码:

import re 
sections = [] 
current = []
with open("Aberdeen2005.txt") as f:
    for line in f:
        if re.search(r"(?i)\d+ of \d+ DOCUMENTS", line):        
           sections.append("".join(current))
           current = [line]
        else:
           current.append(line)

print(len(sections)) 

现在,文章由表达式sections

表示

接下来我要做的是将文章分组为2组。那些包含以下词语的文章:经济或经济和不确定性或不确定和税收或政策,用数字1标识它们。

而那些包含以下词语的文章:经济或经济和不确定或不确定性和监管或支出,用数字2标识它们。这是我到目前为止所尝试的:

for i in range(len(sections)):
group1 = re.search(r"+[economic|economy].+[uncertainty|uncertain].+[tax|policy]", , sections[i])
group2 = re.search(r"+[economic|economy].+[uncertainty|uncertain].+[regulation|spending]", , sections[i])

然而,它似乎不起作用。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

这有点罗嗦,但你可以在不使用正则表达式的情况下离开,例如:

# Take a lowercase copy for comparisons
s = sections[i].lower()
if (('economic' in s or 'economy' in s) and
    ('uncertainty' in s or 'uncertain' in s) and
    ('tax' in s or 'policy' in s)):
    do_stuff()

答案 1 :(得分:2)

可以将其写为单个正则表达式,但这有点棘手。对于每个and,您将使用零宽度前瞻断言(?= ),并且对于每个or,您将使用分支。此外,我们必须使用\b作为单词边界。我们使用re.match代替re.search

belongs_to_group1 = bool(re.match(
     r'(?=.*\b(?:economic|economy)\b)'
     r'(?=.*\b(?:uncertain|uncertainty)\b)'
     r'(?=.*\b(?:tax|policy)\b)', text, re.I))

因此不太可读。

更有成效的方法是找到所有单词并将它们放入集合中

words = set(re.findall(r'\w+', text.lower()))
belongs_to_group1 = (('uncertainty' in words or 'uncertain' in words)
    and ('economic' in words or 'economy' in words)
    and ('tax' in words or 'policy' in words))

答案 2 :(得分:-1)

您可以使用re.search查找这些字词。然后你可以使用if语句和python的andor语句作为逻辑,然后将第一组和第二组存储为两个列表,并将段索引号作为值。

您可能需要注意的一件事是您的逻辑可能需要括号。

通过

经济或经济和不确定性或不确定和税收或政策

我认为你的意思是

(经济或经济)和(不确定性或不确定性)和(税收或政策)

与(例如)

不同

经济或(经济和不确定性)或(不确定和税收)或政策

EDIT1: Python将从左到右评估你的语句没有括号,即:

<(>((((经济或经济)和不确定性)或不确定)和税收)或政策)

我想象的并不是你想要的(例如,如果它包含单词policy但不包含其他单词,则上面评估为true)

EDIT2: 正如评论中指出的那样,EDIT1是不正确的,虽然你仍然需要括号来实现案例1,如果你没有它们你会得到案例2(而案例3是一堆垃圾)