簡體   English   中英

Python中的布爾搜索文本文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM