str = "cmd -opt1 { a b c d e f g h } -opt2"
Я хочу такой вывод:Split пространством сохраняющих строки внутри фигурных скобок
[ 'cmd', '-opt1', '{ a b c d e f g h }', '-opt2' ]
str = "cmd -opt1 { a b c d e f g h } -opt2"
Я хочу такой вывод:Split пространством сохраняющих строки внутри фигурных скобок
[ 'cmd', '-opt1', '{ a b c d e f g h }', '-opt2' ]
В этой ситуации, не пытаются расколоть, используйте 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')
Я также хочу проанализировать команду с фигурными внутри фигурными фигурными скобками, например. "cmd -opt1 {a b {c d} e f} -opt2". Вывод такой как: ['cmd', '-opt1', '{a b {c d} e f}', '-opt2']. Возможно ли это так или иначе? –
@DeepakY: Да, возможно, но не с модулем re, вам нужно использовать новый модуль regex: https://pypi.python.org/pypi/regex, который позволяет рекурсивные шаблоны: 'regex.findall (r '[^ {} \ s] + | {(?> [^ {}] + | (? R)) *}', 'cmd ... ' –
ли взглянуть на 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
Я считаю, что метод 'parse_args' ожидает список, например, из' sys.argv'; будет ли он работать правильно на строке? – jonrsharpe
По умолчанию используется 'sys.argv'. Он не будет работать с строкой (будет обрабатывать ее как список символов) – xtofl
Итак, если OP имеет * строку *, как это может им помочь? Вы должны хотя бы включить это предупреждение в ответ. – jonrsharpe
Просто разделить на {
и }
затем разделить отдельные части с помощью регулярного пространства:
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']
Так где же ваш код, и то, что именно проблема с этим? Это похоже на ввод командной строки, почему вы разбираете его вручную, а не получаете его через 'sys.argv'? – jonrsharpe
Эта строка не из ввода командной строки. –
Итак, где * есть * это от? Вероятно, это проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), которая может быть решена * до того, как вы достигнете этого шага. – jonrsharpe