以三种不同方式搜索文件

0 投票
2 回答
1823 浏览
提问于 2025-04-15 17:09

我正在写一个程序,可以用三种不同的方法来搜索一个文件。不过,首先要在命令行中选择使用哪种搜索方式。

比如在命令行中我输入:

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

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

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

这三种搜索的代码都在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可以在文件中找到搜索词,并根据'行数'参数打印出搜索词前后的几行,但我不知道该怎么做。程序3可以找到搜索词的精确匹配,并打印出搜索词之后的所有行。使用re.match不够,因为它只从字符串的开头开始搜索,而不考虑后面的内容。

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

任何帮助都将不胜感激。

谢谢

2 个回答

1

也许对于一个简单的脚本来说,这个内容有点复杂,但在Python的标准库里,你会遇到两个模块:getopt和更方便的optparse

getopt这个模块可以帮助脚本解析命令行参数,也就是在sys.argv里面的那些东西。

optparse比旧的getopt模块更方便、更灵活、更强大,专门用来解析命令行选项。optparse使用了一种更直观的方式来解析命令行:你先创建一个OptionParser的实例,然后给它添加选项,最后解析命令行。optparse还允许用户按照常见的GNU/POSIX语法来指定选项,并且会自动生成使用说明和帮助信息。

3

首先,你应该看看两个非常有用的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而不是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 ...>

编辑:回应Jessica的评论

比如说在我的文件里有 这些词:zoo、zoos和zoological。 如果我输入zoo作为我的搜索类型,所有三个 都会被返回,而不仅仅是zoo

你可以在搜索词周围加上\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很重要,否则你需要对'\'进行转义。

撰写回答