我有一个包含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表示。
我想做的下一件事,是把文章分成两个组。包含以下文字的文章:经济或经济不确定或不确定或不确定和税收或政策,与数字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])然而,这似乎不起作用。知道为什么吗?
发布于 2016-01-26 13:34:20
这有点冗长,但是您可以在这里不使用正则表达式,例如:
# 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()发布于 2016-01-26 17:39:03
可以将它写成一个正则表达式,但这有点棘手。对于每个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))发布于 2016-01-26 12:07:47
您可以使用re.search查找这些单词。然后,您可以使用if语句以及python的and和or语句作为逻辑,然后将第一组和第二组存储为两个列表,并以节索引号作为值。
您可能需要注意的一点是,您的逻辑可能需要括号。
通过
经济或经济与不确定性或不确定性与税收政策
我猜你是说
(经济或经济)和(不确定性或不确定性)和(税收或政策)
与(例如)不同的
经济或(经济和不确定性)或(不确定和税收)或政策
EDIT1: Python将计算从左到右不带括号的语句,即:
(((经济或经济)和不确定性)或不确定)和税收)或政策)
我想这不是您想要的(例如,如果上面包含了策略这个词,那么上面的结果就是true,但是其他的都不包含)。
EDIT2:正如在评论中指出的那样,EDIT1是不正确的,虽然您仍然需要括号才能实现案例1,但是如果没有它们,您将得到案例2(而案例3是一堆垃圾)。
https://stackoverflow.com/questions/35012507
复制相似问题