def parse(query):
    # 这个集合将用于储存不需要的单词。
    unwanted = set()                                   
    # 这个列表将用于储存需要执行交集计算的单词。
    all = []                                           
    # 这个集合将用于储存目前已发现的同义词。
    current = set()                                    
    # 遍历搜索查询语句中的所有单词。
    for match in QUERY_RE.finditer(query.lower()):     
        # 检查单词是否带有 + 号前缀或 - 号前缀。
        word = match.group()                            
        prefix = word[:1]                               
        if prefix in '+-':                             
            word = word[1:]                            
        else:                                         
            prefix = None                             

        # 剔除所有位于单词前面或者后面的单引号，并略过所有停止词。
        word = word.strip("'")                         
        if len(word) < 2 or word in STOP_WORDS:       
            continue                                  

        # 如果这是一个不需要的单词，
        # 那么将它添加到储存不需要单词的集合里面。
        if prefix == '-':                              
            unwanted.add(word)                         
            continue                                  

        # 如果在同义词集合非空的情况下，
        # 遇到了一个不带 + 号前缀的单词，
        # 那么创建一个新的同义词集合。
        if current and not prefix:                     
            all.append(list(current))                  
            current = set()                            
        current.add(word)                             

    # 将正在处理的单词添加到同义词集合里面。
    if current:                                        
        all.append(list(current))                     

    # 把所有剩余的单词都放到最后的交集计算里面进行处理。
    return all, list(unwanted)                        
# <end id="parse-query"/>


# 代码清单 7-4
# <start id="search-query"/>
dataset/ETHPy150Open huangz1990/riacn-code/ch07_listing_source.py/parse/original