使用Python在多个文本中搜索单词(完全匹配)

时间:2012-12-27 11:04:54

标签: python regex search

我想让用户选择并打开多个文本,并在文本中搜索完全匹配。 我希望编码是unicode。

如果我搜索“cat”,我希望它找到“cat”,“cat”,“。cat”而不是“catalog”。

我不知道如何让用户同时在所有文本中搜索两个单词(“cat”或“dog”)?????? 也许我可以使用RE?

到目前为止,我刚刚让用户可以将路径插入到包含要搜索的文本文件的目录中。现在我想让用户(raw_input)在所有文本中搜索两个单词,并且然后打印并保存结果(例如,在document1.txt中找到“search_word_1”和“search_word_2”,在document4.txt中找到“search_word_2”)在单独的文档(search_words)中。

import re, os


path = raw_input("insert path to directory :")
ex_library = os.listdir(path)
search_words = open("sword.txt", "w") # File or maybe list to put in the results
thelist = []

for texts in ex_library:
    f = os.path.join(path, texts)
    text = open(f, "r")
    textname = os.path.basename(texts)
    print textname
    for line in text.read():

    text.close()

3 个答案:

答案 0 :(得分:0)

您需要在空格和标点符号上拆分每个文件中的文本。完成后,您只需在剩余列表中查找您要搜索的单词即可。您还需要将所有内容转换为小写,除非您还需要区分大小写的搜索。

答案 1 :(得分:0)

在这种情况下,正则表达式是合适的工具。

  

我希望它找到“猫”,“猫”,“。cat”而不是“目录”。

模式:r'\bcat\b'

\b匹配字边界。

  

如何让用户同时在所有文本中搜索两个单词(“cat”或“dog”)

模式:r'\bcat\b|\bdog\b'

打印"filename: <words that are found in it>"

#!/usr/bin/env python
import os
import re
import sys

def fgrep(words, filenames, encoding='utf-8', case_insensitive=False):
    findwords = re.compile("|".join(r"\b%s\b" % re.escape(w) for w in words),
                           flags=re.I if case_insensitive else 0).findall
    for name in filenames:
        with open(name, 'rb') as file:
             text = file.read().decode(encoding)
             found_words = set(findwords(text))
             yield name, found_words

def main():
    words = [w.decode(sys.stdin.encoding) for w in sys.argv[1].split(",")]
    filenames = sys.argv[2:] # the rest is filenames
    for filename, found_words in fgrep(words, filenames):
        print "%s: %s" % (os.path.basename(filename), ",".join(found_words))

main()

示例:

$ python findwords.py 'cat,dog' /path/to/*.txt

替代解决方案

为避免在内存中读取整个文件:

import codecs

...
with codecs.open(name, encoding=encoding) as file:
    found_words = set(w for line in file for w in findwords(line))

您还可以在找到的上下文中打印找到的单词,例如,带有突出显示的单词的打印行:

from colorama import init  # pip install colorama
init(strip=not sys.stdout.isatty())  # strip colors if stdout is redirected
from termcolor import colored  # pip install termcolor

highlight = lambda s: colored(s, on_color='on_red', attrs=['bold', 'reverse'])

...
regex = re.compile("|".join(r"\b%s\b" % re.escape(w) for w in words),
                   flags=re.I if case_insensitive else 0)

for line in file:
    if regex.search(line): # line contains words
       line = regex.sub(lambda m: highlight(m.group()), line)
       yield line

答案 2 :(得分:0)

除现有答案外,还有一些(可能有用的)信息:

你应该知道用户在想到“字符”(=字形)时的含义并不总是与Unicode字符相同,而且某些字母可以用多种独特的方式用Unicode字符表示(例如复合字符与基本字符+组合标记。)

要根据字形进行搜索(=大多数情况下用户期望的搜索)而不是特定的Unicode字符序列,在搜索之前需要normalize字符串。