我有一篇包含32篇文章的文本文件。每篇文章都以表达式<Number> 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
接下来我要做的是将文章分组为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])
然而,它似乎不起作用。有什么想法吗?
答案 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的and
和or
语句作为逻辑,然后将第一组和第二组存储为两个列表,并将段索引号作为值。
您可能需要注意的一件事是您的逻辑可能需要括号。
通过
经济或经济和不确定性或不确定和税收或政策
我认为你的意思是
(经济或经济)和(不确定性或不确定性)和(税收或政策)
与(例如)
不同经济或(经济和不确定性)或(不确定和税收)或政策
EDIT1: Python将从左到右评估你的语句没有括号,即:
<(>((((经济或经济)和不确定性)或不确定)和税收)或政策)我想象的并不是你想要的(例如,如果它包含单词policy但不包含其他单词,则上面评估为true)
EDIT2: 正如评论中指出的那样,EDIT1是不正确的,虽然你仍然需要括号来实现案例1,如果你没有它们你会得到案例2(而案例3是一堆垃圾)