Поиск файла 3 разными способами - PullRequest
0 голосов
/ 18 декабря 2009

Я пишу программу, которая ищет файл тремя разными способами. Но, во-первых, в командной строке можно выбрать, какую программу поиска использовать.

Например, в командной строке я набираю:

Поиск по программе 1: python file.py 'search_term' 'файл для поиска'

программа 2 поиска: python file.py -z 'number' 'search_term' «Файл, чтобы быть обыскали»

программа 3 поиска: python file.py -x 'search_term' 'файл для поиска'

Все 3 поисковых скрипта находятся в файле.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 не подходит, потому что он ищет только в начале строки, но не учитывает остальные.

Моя последняя проблема, как бы я различал три программы? использование флагов или отсутствие флага из командной строки?

Любая помощь будет оценена.

Спасибо

Ответы [ 2 ]

3 голосов
/ 18 декабря 2009

Прежде всего вы должны взглянуть на два очень полезных модуля 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 ...>

Редактировать: ответить на комментарий Джессики

скажем, например, в моем файле, который я имел слова: зоопарк, зоопарк и зоологический. Если бы я набрал зоопарк в качестве типа поиска все 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 голос
/ 18 декабря 2009

Возможно, для короткого сценария это немного тяжело, но в стандартной библиотеке pythons вы встретите getopt и более удобный optparse модуль.

getopt Этот модуль помогает сценариям анализировать аргументы командной строки в sys.argv.

optparse - более удобная, гибкая и мощная библиотека для анализа параметров командной строки, чем старый модуль getopt. optparse использует более декларативный стиль анализа командной строки: вы создаете экземпляр OptionParser, заполняете его опциями и анализируете командную строку. optparse позволяет пользователям указывать параметры в обычном синтаксисе GNU / POSIX и дополнительно генерирует для вас сообщения об использовании и справке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...