2009-12-17 40 views
0

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

例如在命令行I型:

方案1个搜索:蟒file.py 'SEARCH_TERM' '文件将要被搜索的'

方案2的搜索:Python文件的.py -z “编号”“SEARCH_TERM” “文件将要被搜索的”

方案3的搜索:蟒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后的所有行。重新匹配是不充分的,因为它只从字符串的开头搜索它并不考虑其余部分。

我最后的问题是如何区分这三个程序?使用命令行中的标志或无标志?

任何帮助,将不胜感激。

感谢

+0

我编辑我的答案,我希望答案是清楚的现在。 – 2009-12-18 00:39:42

回答

1

也许这是一个有点沉重一小段脚本,但在蟒蛇标准库,你会遇到的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 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 将是相当retured不仅仅是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是重要的,否则你必须逃离“\”

+0

到目前为止,感谢您的帮助,我正在阅读optparse模块,并发现它只是一个初学者,让我感到困惑。使用re.search搜索整个字符串,我需要与该行完全匹配,并在其后打印所有行。 – Jessica 2009-12-17 23:46:53

+0

你能否澄清为什么re.search不适合你? – 2009-12-17 23:49:15

+0

例如在我的文件中说我有以下字样:动物园,动物园和动物园。如果我将动物园作为我的搜索类型输入,则所有3个都会变得反而不是动物园。 – Jessica 2009-12-17 23:54:56