我一直在编写一个以3种不同方式搜索文件的程序。但首先,要在命令行中选择使用哪个搜索程序。
例如,在命令行中输入:
程序1搜索:python file.py 'search_term''待搜索文件'
程序2搜索:python file.py -z 'number''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之后的所有行。 re.match是不合适的,因为它只从字符串的开头搜索它不考虑其余部分。
我的最后一个问题是如何区分三个程序?使用标志或命令行没有标志?
任何帮助都将不胜感激。
由于
答案 0 :(得分: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 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 ...>
编辑:回答杰西卡的评论
例如在我的文件中说我有 单词:动物园,动物园和动物园。 如果我输入动物园作为我的搜索类型全部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很重要,否则你必须逃避'\'
答案 1 :(得分:1)