使用Python在一个.txt文件中搜索单词或短语列表(并显示上下文)

pru*_*ert 3 python search text

问题基本上就是这样.我是Python的新手,喜欢通过观察和实践来学习.

我想创建一个脚本来搜索某些单词或短语的文本文档(例如,从新闻文章复制和粘贴的文本).理想情况下,单词和短语列表将存储在单独的文件中.

获得结果时,获得结果的上下文会很棒.因此,也许它可以在找到的每个搜索词之前和之后打印出文本文件中的50个字符.如果它还显示搜索词的哪一行,那就太酷了.

任何有关如何编码,甚至代码示例的指针都将非常感激.

Ale*_*lli 6

尽管Python社区中许多人经常表达对正则表达式的反感,但它们确实是适当用例的宝贵工具 - 这肯定包括识别单词和短语(归功于\b常规中的"单词边界"元素)表达模式 - 基于字符串处理的替代方案更成问题,例如,.split()使用空格作为分隔符,因此烦人地将标点符号附加到与其相邻的单词等等.

如果RE没问题,我建议如下:

import re
import sys

def main():
  if len(sys.argv) != 3:
    print("Usage: %s fileofstufftofind filetofinditin" % sys.argv[0])
    sys.exit(1)

  with open(sys.argv[1]) as f:
    patterns = [r'\b%s\b' % re.escape(s.strip()) for s in f]
  there = re.compile('|'.join(patterns))

  with open(sys.argv[2]) as f:
    for i, s in enumerate(f):
      if there.search(s):
        print("Line %s: %r" % (i, s))

main()
Run Code Online (Sandbox Code Playgroud)

第一个参数是(路径)文本文件,其中包含要查找的单词或短语,每行一个,以及用于查找它们的文本文件的第二个参数(路径).如果需要,可以轻松地使案例对搜索不敏感(可能只是可选地基于命令行选项开关)等.

对不熟悉RE的读者的一些解释......:

\b在该项目的patterns项目确保不会有意外的比赛(如果你搜索"猫"和"狗",你不会看到一个偶然打正着"目录"或"落水狗";而你不会错过了"猫,微笑,逃跑"中的一个分裂,认为那个词有"猫",包括逗号;-).

|项目的意思是or,例如来自带有内容的文本文件(两行)

cat
dog
Run Code Online (Sandbox Code Playgroud)

这将形成'\bcat\b|\bdog\b'将定位"猫"或"狗"的模式(作为独立的单词,忽略标点符号,但拒绝在较长的单词中命中).

re.escape逃逸标点符号所以它的字面匹配,不因为它通常会在一个RE模式特殊的意义.