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

标签 python search text

基本上如问题所述。我是 Python 的新手,喜欢通过观察和实践来学习。

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

在得到结果的时候,如果能得到结果的上下文就好了。所以也许它可以打印出文本文件中找到的每个搜索词前后的 50 个字符。如果它还显示在哪一行找到搜索词,那就太好了。

任何有关如何对此进行编码甚至代码示例的指示都将不胜感激。

最佳答案

尽管 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()

第一个参数是包含要查找的单词或短语的文本文件(路径),每行一个,第二个参数(路径)是要在其中查找它们的文本文件。如果需要,可以很容易地使大小写搜索不敏感(可能只是基于命令行选项开关可选),等等。

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

patterns 项中的 \b 项确保不会出现意外匹配(如果您正在搜索“cat”或“dog”,则您赢了不会看到“目录”或“失败者”的意外命中;你不会错过“猫,微笑,逃跑”中的一些 split ,认为那里有“猫”这个词,包括逗号; -).

| 项表示,例如来自包含内容的文本文件(两行)

cat
dog

这将形成 '\bcat\b|\bdog\b' 模式,它将定位“cat”或“dog”(作为独立词,忽略标点符号,但拒绝命中在更长的词中)。

re.escape 转义标点符号,因此它按字面匹配,而不是像通常在 RE 模式中那样具有特殊含义。

关于python - 使用 Python 在一个 .txt 文件中搜索单词或短语列表(并显示上下文),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3007889/

相关文章:

search - block 世界问题搜索用完堆栈空间

search - 如何为一对多关系配置 Solr

text - 如何在android中的开关按钮及其文本之间放置空格?

python - BeautifulSoup 无法工作,出现 NoneType 错误

python - 元素不可见异常 : Message: element not interactable in Robot Framework

python - SVM分类任务中word2vec特征的输入格式是什么?

python - 什么都找不到时使用 lxml findtext 抛出异常的更好方法

MySQL 搜索字符串首先以 string 开头,但也会返回包含 string 的任何结果

javascript - css 指定 < >

javascript - 如何在不使用 jQuery 更改 html 的情况下更改元素的同级文本?