通过保留引用的子串的空格将N个元素拆分为一个字符串

时间:2012-11-06 10:32:30

标签: python

我想用空格将一个字符串拆分为3个元素,但我不希望拆分引用的子字符串(它们也可以包含反斜杠来转义引号)。

例如:

"command argument other arguments and options"
>> ['command', 'argument', 'other arguments and options']

'command "my argument" other arguments and options'
>> ['command', 'my argument', 'other arguments and options']

'command "my \"ugly\" argument" other "arguments" and options'
>> ['command', 'my "ugly" argument', 'other "arguments" and options']

我查看了这个similar question,但是shlex.split()也将分割字符串的结尾(它将删除引号和空格),而我想保持第三个元素完整。< / p>

我尝试使用shlex.split(mystring)[0:2]来获取前两个元素但是我无法找到一个很好的解决方案来从原始字符串中提取第三个元素。实际上我希望我能shlex.split()使用str.split()方法和maxsplit参数。

有没有比使用shlex.split()更好的方法呢?也许是正则表达式?谢谢!

2 个答案:

答案 0 :(得分:5)

您应该能够通过访问shlex对象的解析器状态来破解解决方案:

>>> import shlex
>>> s = shlex.shlex("command 'my \'ugly\' argument' other \"arguments\" and options", posix=True)
>>> s.whitespace_split = True
>>> s.commenters = ''
>>> next(s)
'command'
>>> next(s)
'my ugly argument'
>>> s.instream.read()
'other "arguments" and options'

请参阅shlex.py模块来源。

答案 1 :(得分:1)

在将shlex

拆分后,为什么不重新加入其余参数?
command = command[:2] + [' '.join(command[2:])]

或者,您必须自己驾驶shlex.shlex()实例:

>>> import shlex
>>> input = "command 'my \'ugly\' argument' other \"arguments\" and options"
>>> lex = shlex.shlex(input, posix=True)
>>> lex.whitespace_split=True
>>> lex.commenters = ''
>>> command = [lex.next(), lex.next(), lex.instream.read()]
>>> command
['command', 'my ugly argument', 'other "arguments" and options']

.instream属性是包含正在解析的文本的类文件对象,因此在解析前两个参数后将包含余数。

有可能你需要访问回退状态,lexer存储令牌,但当前令牌不需要它:

>>> command = [lex.next(), lex.next(), ''.join(list(lex.pushback)) + lex.instream.read()]