在Python中进行布尔搜索文本文件

3
我有一个包含32篇文章的文本文件。每篇文章都以表达式“ of 32 DOCUMENTS”开头,例如:“1 of 32 DOCUMENTS”,“2 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表示。

接下来我想做的是将文章分成两组。包含词语:economy OR economic AND uncertainty OR uncertain AND tax OR policy的文章,用数字1来标识。

而包含以下词语的文章:economy OR economic AND uncertain OR uncertainty AND regulation OR spending,用数字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])

然而,它似乎没有起作用。有什么想法为什么会这样?

请描述一下“用数字‘x’来标识它们”的预期输出是什么。 - OneCricketeer
创建一个符合特定条件的文章组:例如,group1 = sections [1,3,7,9] 和 group2 = sections [2,4,10,27]。 - Economist_Ayahuasca
任何一种都可以,因为我是新手,不知道哪种可能更直接 :) - Economist_Ayahuasca
有什么想法为什么我的尝试可能不起作用吗?谢谢。 - Economist_Ayahuasca
1
@AndresAzqueta 你应该阅读 正则表达式 HOWTO,并使用 regex101 在文本上尝试正则表达式。后者的正则表达式甚至不能编译。 - Antti Haapala -- Слава Україні
显示剩余4条评论
3个回答

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

这不考虑单词边界。 - Antti Haapala -- Слава Україні
@AnttiHaapala 正确。 - glibdud
你的意思是它完全不考虑单词边界吗? - Economist_Ayahuasca
1
@AndresAzqueta 这个解决方案不仅匹配包含"tax"的部分,还可以匹配例如"ataxia"。换句话说,它不是匹配整个单词,而只是检查确保这些特定字符序列在该部分任何位置存在。如果这对您来说是一个重要的区别,您需要进一步研究正则表达式。 - glibdud
太棒了,感谢你的提示。我会检查正则表达式并实施一些改变来解决这个问题。干杯! - Economist_Ayahuasca

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

你能把 uncertain|uncertainty 缩写成 uncertain(?:ty)? 吗?还有 economic|economy 缩写成 econom(?:ic|y) - OneCricketeer
我确实这样做了,但我撤销了它,因为这使得它更难读懂了。 - Antti Haapala -- Слава Україні

-1

您可以使用re.search来查找这些单词。然后,您可以使用if语句和Python的andor语句进行逻辑操作,然后将第一组和第二组作为两个列表存储,并将章节索引号作为值。

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

通过

economy OR economic AND uncertainty OR uncertain AND tax OR policy

我想您的意思是

(economy OR economic) AND (uncertainty OR uncertain) AND (tax OR policy)

这与(例如)

economy OR (economic AND uncertainty) OR (uncertain AND tax) OR policy

不同

编辑1: Python将从左到右评估您的语句,即:

((((economy OR economic) AND uncertainty) OR uncertain) AND tax) OR policy)

我想这不是您想要的(例如,如果它包含单词policy但没有其他单词,则上述计算结果为true)

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


Python 绝对 不会 像那样从左到右评估 andor。相反,and 会先被评估,然后才是 or - Antti Haapala -- Слава Україні
@antti 哇,这很有趣。我原以为它会像数学上一样进行计算。and被首先计算是否意味着 "economy OR economic AND uncertainty OR uncertain" 变成了 " economy OR (economic AND uncertainty) OR uncertain" 还是变成了 "(economy OR economic) AND (uncertainty OR uncertain)"? - user3088440
在Python、大多数其他编程语言以及数学中,and的优先级高于or - bereal
@user3088440:这将成为你的第一个案例。没有任何括号,且“and”的优先级高于“or”。顺便说一下,这在数学上是正确的,因为乘法/除法比加法/减法优先级更高。 - AdmiralWen
哦,我不知道,我一直都是在任何有歧义的地方加括号。好知道! - user3088440

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接