pru*_*ert 3 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()
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模式特殊的意义.