我想让用户选择并打开多个文本,并在文本中搜索完全匹配。 我希望编码是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()
答案 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字符串。