Python:在关键词后面找到两个单词

时间:2015-03-24 02:35:35

标签: python loops append

我确信我在这里遗漏了一些明显的东西,但是我一直盯着这段代码而找不到问题的根源。

我想搜索许多字符串,查找某些关键字的所有匹配项,并针对每个匹配项,检索(并保存)紧跟在关键字之前和之后的两个单词。 到目前为止,代码我找到了这些单词,但是当字符串中出现多个关键字时,代码会返回两个不同的列表。如何在观察/字符串级别聚合这些列表(以便我可以将其匹配回字符串i)?

以下是样本和所需结果的模拟示例。关键字是“不”:

review_list=['I like this book.', 'I do not like this novel, no, I do not.']
results= [[], ['I do not like this I do not']] 

目前的结果(使用下面的代码)将是: 结果= [[],['我不喜欢这个'],['我不']]

以下是代码(简化版):

for i in review_list:
    if (" not " or " neither ") in i:
      z = i.split(' ')
      for x in [x for (x, y) in enumerate(z) if find_not in y]:
        neg_1=[(' '.join(z[max(x-numwords,0):x+numwords+1]))]
        neg1.append(neg_1)

    elif (" not " or " neither ") not in i:
      neg_1=[]
      neg1.append(neg_1)

同样,我确信这是基本的,但作为一个新的Python用户,任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

仅从字符串中提取单词(删除标点符号),例如

'I do not like this novel, no, I do not.'

我推荐正则表达式:

import re
words = re.findall(r'\w+', somestring)

查找一个单词等于not的所有索引:

indices = [i for i, w in enumerate(words) if w=='not']

要获取前两个和后面的字词,我建议使用set删除重复内容:

allindx = set()
for i in indices:
    for j in range(max(0, i-2), min(i+3, len(words))):
        allindx.add(j)

最后将所有有问题的单词加入到空格连接的字符串中:

result = ' '.join(words[i] for i in sorted(allindx))

现在我们当然可以把所有这些花絮放在一个函数中......:

import re
def twoeachside(somestring, keyword):
    words = re.findall(r'\w+', somestring)
    indices = [i for i, w in enumerate(words) if w=='not']
    allindx = set()
    for i in indices:
        for j in range(max(0, i-2), min(i+3, len(words)):
            allindx.add(j)
    result = ' '.join(words(i) for i in sorted(allindx))
    return result

当然,这个功能适用于一个句子。从句子列表中得出结果列表:

review_list = ['I like this book.', 'I do not like this novel, no, I do not.']
results = [twoeachside(s, 'not') for s in review_list]
assert results == [[], ['I do not like this I do not']]

最后assert当然只是检查代码是否符合您的要求: - )

编辑:实际上从这个例子来看,你有点荒谬地要求结果'项目为列表,如果非空,则为单个字符串项,但如果其中的字符串为空则为空列表。这个绝对奇怪的规范当然也可以满足......:

results = [twoeachside(s, 'not') for s in review_list]
results = [[s] if s else [] for s in results]

它没有任何意义,但是嘿!它是你的规范! - )