Python中的布尔搜索文本文件

Python中的布尔搜索文本文件,python,Python,我有一个包含32篇文章的文本文件。每篇文章都以以下表达式开头:共32个文档,例如:1/32个文档,2/32个文档,等等。为了查找每篇文章,我使用了以下代码: import re sections = [] current = [] with open("Aberdeen2005.txt") as f: for line in f: if re.search(r"(?i)\d+ of \d+ DOCUMENTS", line): s

我有一个包含32篇文章的文本文件。每篇文章都以以下表达式开头:
共32个文档
,例如:
1/32个文档
2/32个文档
,等等。为了查找每篇文章,我使用了以下代码:

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

我想做的下一件事是将文章分为两组。包含以下词语的文章:经济或经济和不确定性或不确定性和税收或政策,用数字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])

然而,它似乎不起作用。你知道为什么吗?

你可以使用搜索来查找这些单词。然后,您可以使用if语句和python的
以及
语句作为逻辑,然后将组1和组2存储为两个列表,并将节索引号作为值

您可能需要注意的一点是,您的逻辑可能需要括号

经济或经济不确定性或不确定性以及税收或政策

我想你是说

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

这与(例如)不同

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

编辑1: Python将从左到右计算您的语句,无括号,即:

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

我想这不是你想要的(例如,如果上面的评估结果包括单词policy,但不包括其他单词,则为true)

编辑2:
正如评论中指出的那样,EDIT1是不正确的,尽管您仍然需要括号来实现案例1,但如果没有括号,您将得到案例2(案例3是一堆垃圾)

这有点冗长,但您可以在这里不使用正则表达式,例如:

# 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()

可以将其作为单个正则表达式编写,但这有点棘手。对于每个
您将使用一个零宽度前瞻断言
(?=)
,对于每个
您将使用一个分支。此外,我们还必须使用
\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))

描述“用数字“x”标识它们”的预期输出对您来说是什么样子的。好吧,创建一个包含所有满足特定条件的文章的组:例如group1=sections[1,3,7,9]和group2=sections[2,4,10,27]。好的,我认为更多的是一个字典
{“1”:[1,3,7,9],“2”:[2,4,10,27]
两者都有效,正如我所说,我对这一点还不熟悉,我不知道哪一个更直截了当:)@AndresAzqueta您应该阅读并尝试使用正则表达式对文本进行正则化。后一个正则表达式甚至不编译,Python绝对不会像这样从左到右计算
。相反,
s始终首先计算,而
safterwards@antti哈,这很有趣。我假设它的计算结果和数学上的一样。首先被评估的
是否意味着“经济或经济和不确定性或不确定性”变为“经济或(经济和不确定性)或不确定性”,或者它变为“(经济或经济)和(不确定性或不确定性)”@user3088440
的优先级高于Python和大多数其他语言中的
,@user3088440:这将成为您的第一个案例。没有任何括号,在or之前。顺便说一句,这是数学上的,因为乘法/除法先于加法/减法。嗯,我不知道,我总是把模棱两可的东西括起来。很高兴知道!这并不考虑单词边界。all@AnttiHaapala修正。你的意思是它根本不考虑单词边界?@和ReSaqQueta这个解决方案不仅匹配包含“税收”的部分,而且还可以匹配,例如“共济失调”。换句话说,它不是匹配整个单词,而是检查以确保这些特定的字符序列存在于部分的某个位置。如果这对你来说是一个重要的区别,你需要进一步研究正则表达式。太好了,谢谢你的提示。我将检查regex并实现一些更改来处理这个问题。干杯,你能把
不确定|不确定
缩短为
不确定(?:ty)?
?而
economic | economy
economic(?:ic | y)
我做了,但我回复了,因为它使它更不可读