Python中的布尔搜索文本文件
我有一个包含32篇文章的文本文件。每篇文章都以以下表达式开头: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个文档
,例如: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)
我做了,但我回复了,因为它使它更不可读