2015-06-18 2 views
3
str = "cmd -opt1 { a b c d e f g h } -opt2" 

Я хочу такой вывод:Split пространством сохраняющих строки внутри фигурных скобок

[ 'cmd', '-opt1', '{ a b c d e f g h }', '-opt2' ] 
+2

Так где же ваш код, и то, что именно проблема с этим? Это похоже на ввод командной строки, почему вы разбираете его вручную, а не получаете его через 'sys.argv'? – jonrsharpe

+0

Эта строка не из ввода командной строки. –

+1

Итак, где * есть * это от? Вероятно, это проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), которая может быть решена * до того, как вы достигнете этого шага. – jonrsharpe

ответ

5

В этой ситуации, не пытаются расколоть, используйте re.findall:

>>> import re 
>>> re.findall(r'{[^}]*}|\S+', 'cmd -opt1 { a b c d e f g h } -opt2') 
['cmd', '-opt1', '{ a b c d e f g h }', '-opt2'] 

Если вам нужно иметь дело с вложенными фигурными скобками, то модуля re недостаточно, вам нужно использовать "new" regex module, у которого есть recu rsion.

>>> import regex 
>>> regex.findall(r'[^{}\s]+|{(?:[^{}]+|(?R))*+}', 'cmd -opt1 { a b {c d} e f} -opt2') 
['cmd', '-opt1', '{ a b {c d} e f}', '-opt2'] 

Где (?R) относится ко всему рисунку.

или это один (что лучше):

regex.findall(r'[^{}\s]+|{[^{}]*+(?:(?R)[^{}]*)*+}', 'cmd -opt1 { a b {c d} e f} -opt2') 
+0

Я также хочу проанализировать команду с фигурными внутри фигурными фигурными скобками, например. "cmd -opt1 {a b {c d} e f} -opt2". Вывод такой как: ['cmd', '-opt1', '{a b {c d} e f}', '-opt2']. Возможно ли это так или иначе? –

+0

@DeepakY: Да, возможно, но не с модулем re, вам нужно использовать новый модуль regex: https://pypi.python.org/pypi/regex, который позволяет рекурсивные шаблоны: 'regex.findall (r '[^ {} \ s] + | {(?> [^ {}] + | (? R)) *}', 'cmd ... ' –

2

ли взглянуть на the argparse module, так как я предполагаю, что вы пишете код для разбора аргументов вашей программы. Обычно эти аргументы хранятся в sys.argv, поэтому вам даже не нужно заботиться о разделении строки командной строки. Если вы настаиваете на использовании командной строки, вы можете преобразовать строку аргумента в список аргументов с помощью метода str.split.

import argparse 

parser = argparse.ArgumentParser(description='whatever cmd does.') 
parser.add_argument('--opt1', metavar='N', type=int, nargs='+', 
        help='integers') 

options = parser.parse_args() 

for n in options.opt1: 
    # do something with n 
+0

Я считаю, что метод 'parse_args' ожидает список, например, из' sys.argv'; будет ли он работать правильно на строке? – jonrsharpe

+0

По умолчанию используется 'sys.argv'. Он не будет работать с строкой (будет обрабатывать ее как список символов) – xtofl

+0

Итак, если OP имеет * строку *, как это может им помочь? Вы должны хотя бы включить это предупреждение в ответ. – jonrsharpe

0

Просто разделить на { и } затем разделить отдельные части с помощью регулярного пространства:

str = "cmd -opt1 { a b c d e f g h } -opt2" 
>>> a, b = str.split("{") 
>>> c, d = b.split("}") 
>>> a.split() + ["{{{0}}}".format(c)] + d.split() 
['cmd', '-opt1', '{ a b c d e f g h }', '-opt2'] 
Смежные вопросы