在花括号内用空格保留字符串

时间:2015-06-18 09:16:24

标签: python regex

str = "cmd -opt1 { a b c  d e f g h } -opt2" 

我想要这样的输出:

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

4 个答案:

答案 0 :(得分: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

>>> 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')

答案 1 :(得分:4)

\s+(?![^{]*})

你可以这样拆分。参见演示。

https://regex101.com/r/jV9oV2/6

答案 2 :(得分: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

答案 3 :(得分: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']