[英]Boolean search text file in Python
我有一篇包含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])
然而,它似乎不起作用。 有什么想法嗎?
這有點羅嗦,但你可以在不使用正則表達式的情況下離開,例如:
# 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()
可以將其寫為單個正則表達式,但這有點棘手。 對於每一個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))
您可以使用re.search查找這些單詞。 然后,您可以對邏輯使用if語句和python的and
/ or
語句,然后將第一組和第二組存儲為兩個列表,並將段索引號作為值。
您可能需要注意的一件事是您的邏輯可能需要括號。
通過
經濟或經濟和不確定性或不確定和稅收或政策
我猜你的意思
(經濟或經濟)和(不確定性或不確定性)和(稅收或政策)
這與(例如)不同
經濟或(經濟和不確定性)或(不確定和稅收)或政策
EDIT1:Python將從左到右評估你的語句沒有括號,即:
(((((經濟或經濟)和不確定性)或不確定)和稅收)或政策)
我想象的並不是你想要的(例如,如果它包含單詞policy但是沒有其他單詞,則上面評估為true)
EDIT2:正如評論中指出的那樣,EDIT1是不正確的,雖然你仍然需要括號來實現案例1,如果你沒有它們你會得到案例2(而案例3是一堆垃圾)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.