【问题标题】:Searching a file in 3 different ways以 3 种不同方式搜索文件
【发布时间】:2009-12-17 23:20:19
【问题描述】:

我一直在编写一个以 3 种不同方式搜索文件的程序。但首先,在命令行中选择使用哪个搜索程序是有区别的。

例如在命令行中输入:

程序1搜索:python file.py 'search_term' '要搜索的文件'

程序2搜索:python file.py -z '数字' 'search_term' '要搜索的文件'

程序3搜索:python file.py -x 'search_term' '要搜索的文件'

所有 3 个搜索脚本都在 file.py 中。

我目前的编码是:

import re
import sys
#program 1
search_term = sys.argv[1]
f = sys.argv[2]

for line in open(f, 'r'):
    if re.search(search_term, line):
     print line,

# Program 2
flag = sys.argv[1]
num = sys.argv[2]
search_term = sys.argv[3]
f = sys.argv[4]

#program 3
flag = sys.argv[1]
search_term = sys.argv[2]
f = sys.argv[3]

for line in open(f, 'r'):
 if re.match(search_term, line):
  print line,

程序 1 运行良好,没问题。程序 2,在文件中找到搜索词并打印出由 'number' 参数定义的前后几行,但我不知道如何执行此操作。程序 3 从 search-term 中找到完全匹配并打印出 search_term 之后的所有行。 re.match 是不够的,因为它只从字符串的开头搜索它不考虑其余部分。

我的最后一个问题是如何区分这三个程序?从命令行使用标志还是不使用标志?

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 我编辑了我的答案,希望现在答案很清楚。

标签: python file search


【解决方案1】:

首先你应该看看两个非常有用的 Python 模块:

  • fileinput: 遍历行 来自多个输入流
  • optparse: 一个强大的命令 行选项解析器

fileinput 将帮助您从多个文件中读取行,甚至在需要时修改它们。使用这些工具,您的程序将更容易扩展和阅读

这是一个例子:

import fileinput
import optparse

if __name__ == '__main__':
    parser = optparse.OptionParser()
    parser.add_option("-z", dest="z", help="Description here")
    parser.add_option("-x", dest="x", help="Description here")
    options, args = parser.parse_args()
    search_term = args[0]
    for line in fileinput.input(args[1:]):
        process(line)

您可以使用re.search instead of re.match进行匹配。文档中的一个示例:

>>> re.match("o", "dog")  # No match as "o" is not the first letter of "dog".
>>> re.search("o", "dog") # Match as search() looks everywhere in the string.
<_sre.SRE_Match object at ...>

编辑:回答杰西卡的评论

例如在我的文件中我有 词:动物园,动物园和动物学。 如果我输入 zoo 作为我的搜索类型所有 3 将被退回而不仅仅是 zo0

您可以将搜索词包含在 \b 中以仅匹配单词,例如:

>>> re.search(r'\bzoo\b', 'test zoo')
<_sre.SRE_Match object at 0xb75706e8>
>>> re.search(r'\bzoo\b', 'test zoos')
>>> re.search(r'\bzoo\b', 'test zoological')

\b 匹配一个空字符串,但只匹配单词的开头或结尾。

所以在你的脚本中你可以这样做:

searchterm = r'\b%s\b' % searchterm

注意:这里的 r 很重要,否则你必须转义 '\'

【讨论】:

  • 感谢您到目前为止的帮助,我正在阅读 optparse 模块,发现它让我只是一个初学者感到很困惑。使用 re.search 它搜索整个字符串,我需要与该行完全匹配,并且在它之后打印所有行。
  • 例如,在我的文件中,我有这样的词:动物园、动物园和动物学。如果我输入 zoo 作为我的搜索类型,所有 3 都将被返回,而不仅仅是 zoo。
【解决方案2】:

也许对于一个简短的脚本来说有点沉重,但是在pythons标准库中,你会遇到getopt和更方便的optparse模块。

getopt 该模块帮助脚本解析 sys.argv 中的命令行参数。

optparse 是一个比旧的 getopt 模块更方便、灵活和强大的命令行选项解析库。 optparse 使用更具声明性的命令行解析方式:创建 OptionParser 的一个实例,用选项填充它,然后解析命令行。 optparse 允许用户以传统的 GNU/POSIX 语法指定选项,并额外为您生成使用和帮助消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多