Python文本搜索库

时间:2015-02-26 22:02:40

标签: python parsing full-text-search negate

我正在寻找一个能让我做以下事情的图书馆:

matches(
    user_input="hello world how are you what are you doing",
    keywords='+world -tigers "how are" -"bye bye"'
)

基本上我希望它根据单词的存在,单词的缺失和单词序列来匹配字符串。我不需要搜索引擎和Solr,因为字符串不会提前知道,只会被搜索一次。这样的库是否已经存在,如果存在,我会在哪里找到它?或者我注定要创建一个正则表达式生成器?

2 个答案:

答案 0 :(得分:0)

regex module支持命名列表:

import regex

def match_words(words, string):
    return regex.search(r"\b\L<words>\b", string, words=words)

def match(string, include_words, exclude_words):
    return (match_words(include_words, string) and
            not match_words(exclude_words, string))

示例:

if match("hello world how are you what are you doing",
         include_words=["world", "how are"],
         exclude_words=["tigers", "bye bye"]):
    print('matches')

您可以使用标准re模块实现命名列表,例如:

import re

def match_words(words, string):
    re_words = '|'.join(map(re.escape, sorted(words, key=len, reverse=True)))
    return re.search(r"\b(?:{words})\b".format(words=re_words), string)
  

如何根据+, - 和“”语法构建包含和排除的单词列表?

您可以使用shlex.split()

import shlex

include_words, exclude_words = [], []
for word in shlex.split('+world -tigers "how are" -"bye bye"'):
    (exclude_words if word.startswith('-') else include_words).append(word.lstrip('-+'))

print(include_words, exclude_words)
# -> (['world', 'how are'], ['tigers', 'bye bye'])

答案 1 :(得分:0)

从您给出的示例中,除非您在单词中查找模式/表达,否则不需要正则表达式。

    d="---your string ---"
    mylist= d.split()
    M=[]
    Excl=["---excluded words---"]
    for word in mylist:
        if word not in Excl:
            M.append(word)
    print M

您可以编写一个通用函数,可以与任何字符串列表和排除列表一起使用。