以三种不同方式搜索文件
我正在写一个程序,可以用三种不同的方法来搜索一个文件。不过,首先要在命令行中选择使用哪种搜索方式。
比如在命令行中我输入:
程序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 个回答
3
首先,你应该看看两个非常有用的Python模块:
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很重要,否则你需要对'\'进行转义。