Python 检测列表中引用的单词

Python 检测列表中引用的单词,python,Python,我有一个列表,对应这样一个问题: my_list = ["What", "language", "does", "the", "word", "«", "vibrato", "»", "come", "from", "?"] 我的程序检测这个问题中是否有否定(通过检测单词“not”,“don…”) 问题是,当这些词出现在引用语中时,它也会检测到它们,这是不需要的,例如,如果它是电影的名称 只有当否定词不出现在引号之间时,我如何才能在句子中发现它们 示例:假设我的列表是: my_list =

我有一个列表,对应这样一个问题:

my_list = ["What", "language", "does", "the", "word", "«", "vibrato", "»", "come", "from", "?"]
我的程序检测这个问题中是否有否定(通过检测单词“not”,“don…”)

问题是,当这些词出现在引用语中时,它也会检测到它们,这是不需要的,例如,如果它是电影的名称

只有当否定词不出现在引号之间时,我如何才能在句子中发现它们


示例:假设我的列表是:

my_list = ["who", "is", "not", "an", "animal", "?"]
这是一个否定的问题,但如果我有:

my_list = ["who", "is", "James Bond", "in", "the", "movie", "«", "kill", "is", "not", "a", "game", "»", "?"]
这不是一个否定的问题,因为唯一的否定是在引用中


目前,我检测否定的程序是:

for words in my_list:
    for nword in negative_words:
        if words == nword:
            nega = True
            my_list.remove(words)

很高兴看到你改进了你的问题并重新打开了它,所以我可以发布一个实际的答案:

您缺少的是一个标志,它将在解析时告诉您正在打开引号,并在引号关闭后将其删除,以便您可以继续查看否定词

开发这种脚本之后经常发生的事情是,会遇到嵌套模式,这是事先没有考虑过的——但这不是问题,因为您可以轻松跟踪多个嵌套引号。现在,不要使用单个标志,而是要记住,通过将先前开始的引号添加到列表中,期望哪个字符关闭该引号,并且只有当该列表为空时,才尝试查找否定词。以下脚本的联机演示:

什么是否定匹配器 notwords=(“不”、“不”、“不”、) #什么是报价对(开始,结束) #以下逻辑可以处理嵌套引号, #因此,无需担心就可以指定所需的数量 引号=((“«”、“»”)、(“嫀”、“›”)、(“)、) #当发生故障时,需要断开外环 #找到起始报价 类StartingQuoteFound(异常): 通过 def被否定(句子): #跟踪预期的报价关闭人 结束语_quotes=[] 对于句子中的单词: #检查当前单词是否为引文开头符 尝试: 对于引号中的引号: 如果word==引号[0]: #如果找到,请记住我们等待报价 #在考虑单词匹配之前,请仔细考虑 #不言而喻 结束\u quotes.append(quote[1]) 提升启动QuoteFound() #找到引号开始,请跳到下一个单词 除StartingQuoteFound外: 持续 #如果我们正在等待报价>0关闭 如果结束报价: #这是预期的报价更接近 如果右引号[-1]==单词: #将其从报价单中删除 del收盘报价[-1] #然后转到下一个单词 持续 #检查单词是否在notwords中 #如果被发现,我们知道这个句子被否定了 如果单词中没有单词: 返回真值 #没有找到否定词 返回错误 无动物=[“谁”、“是”、“不是”、“是”、“动物”、“是”?] 打印('expect negation:',is_negated(no_)) jon_is_kill=[“谁”,“是”,“詹姆斯·邦德”,“在”,“电影”,“是”,“不是”,“杀死”,“是”,“不是”,“a”,“游戏”,“›”,“»”,“是”?] print('notexpect negation:',is_negative(jon_is_kill)) wat=[“詹姆斯·邦德”,“在”,“电影”,“是”,“不是”,“杀死”,“是”,“不是”,“a”,“是”,“游戏”,“是”,“不”,“喝酒”,“酒精”] 打印('expect negation:',is_negated(wat))
找到起始引号时使用异常的说明:Python没有可用于中断/继续外部循环的标签,因此需要抛出特定异常并在外部循环中捕获它,因此,在遇到起始引号时,它将继续进行解析,而无需进一步处理该引号开始。

您可以在遇到起始引号时设置一个标志,并忽略所有后续单词,直到遇到结束引号:

flag_ignore = 0
negative_words = ["not", "don't"]
my_list = ["Do", "not", "say", "the", "word", "«", "don't", "»", "I", "don't", "like", "it"]
new_list = []

for word in my_list:
    if not flag_ignore and any(word.lower()==n for n in negative_words):
        pass
    else:
        new_list.append(word)

    if word == "«":
        flag_ignore = 1
    elif word == "»":
        flag_ignore = 0

print " ".join(new_list)
>>> "Do say the word « don't » I like it"

欢迎来到stackoverflow!请拿起这本书,仔细阅读,并提供一份能再现您的问题的报告。特别是提供输入、期望的输出和您编写解决方案的尝试。您可以在遇到开场白时设置一个标志,并忽略随后的所有单词,直到遇到结束语。我认为问题现在已经很清楚,不确定将其保留是否合适。似乎不会重新打开,so-代码内部文档
flag_ignore = 0
negative_words = ["not", "don't"]
my_list = ["Do", "not", "say", "the", "word", "«", "don't", "»", "I", "don't", "like", "it"]
new_list = []

for word in my_list:
    if not flag_ignore and any(word.lower()==n for n in negative_words):
        pass
    else:
        new_list.append(word)

    if word == "«":
        flag_ignore = 1
    elif word == "»":
        flag_ignore = 0

print " ".join(new_list)
>>> "Do say the word « don't » I like it"