Регулярное выражение для сопоставления необязательных параметров в виде групп в строке - PullRequest
1 голос
/ 20 июля 2011

Я пытаюсь прочитать пакетный скрипт, содержащий входную строку команды и необязательные параметры, такие как

input = 'command -a field1 -b field2 -c field3'

Параметры опции задаются пользователем в файле, и я получаю строку, читаяфайл.Если опция включена, мне нужно будет извлечь поле.

В настоящее время мое регулярное выражение имеет вид:

expr = '^(?P<exec>[^\s]+) -m (?P<mode>[^\s]+) -d (?P<machine>[^\s]+) -p (?P<port>[^\s]+)'
m = re.match(expr, input)

Когда пользователь включает все параметры в одном порядке, регулярное выражение совпадаетстрока и группы захвачены.Вот пример выходных данных.

{   'exec': 'custom-script',
    'mode': 'debug',
    'machine': 'desk-123',
    'port': '7905'   }

Однако, если какой-либо параметр не включен, или если они находятся в разных порядках, регулярное выражение не выполняется.Как я могу изменить свое регулярное выражение для выполнения в этих двух случаях?

Ответы [ 3 ]

5 голосов
/ 20 июля 2011

В Python вы можете использовать встроенные модули optparse или argparse, чтобы сделать это для вас, чтобы вам не приходилось возиться с хардкорными регулярными выражениями, которые в конечном итоге не сработают: -)

2 голосов
/ 20 июля 2011

синтаксический анализ параметров командной строки с регулярными выражениями в python очень хрупок - argparse позволит вам обрабатывать все нужные вам аргументы, как необязательные, так и позиционные, и предоставляет множество возможностей для управления ими.Он даже автоматически создает опцию -h для вас!

Например, в вашем случае вы сказали, что у вас есть вход, поэтому вы можете сделать следующее:

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('-m','--mode', help='The mode to run in')
parser.add_argument('-d','--machine', help='The machine of interest')
parser.add_argument('-p','--port', help='The port of interest')
args = parser.parse_args(input.split())

Вывод этого, args, будет иметь различные поля в качестве атрибутов, то есть args.mode, args.machine, args.port

0 голосов
/ 20 июля 2011

Благодаря Нейту я использовал optparse вместо регулярных выражений и использовал следующий код:

parser = optparse.OptionParser(description='Process some integers.')
parser.add_option('-m','--mode', help='The mode to run in')
parser.add_option('-d','--machine', help='The machine of interest')
parser.add_option('-p','--port', help='The port of interest')
(args, others) = parser.parse_args(input.split())

Теперь я могу получить доступ к значениям с помощью args.mode, args.machine и т. Д.

...