3

我想通过空格将一个字符串拆分为 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']

我看过这个类似的问题,但shlex.split()也会拆分字符串的结尾(它会删除引号和空格),而我想保持第三个元素完整。

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

有没有比使用更好的方法来做到这一点shlex.split()?也许正则表达式?谢谢!

4

2 回答 2

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模块源代码。

于 2012-11-06T10:39:13.807 回答
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属性是保存被解析文本的类文件对象,因此将包含解析前两个参数后的剩余部分。

不过,您可能需要访问 pushback 状态,其中词法分析器存储了它查看但当前令牌不需要的令牌:

>>> command = [lex.next(), lex.next(), ''.join(list(lex.pushback)) + lex.instream.read()]
于 2012-11-06T10:34:46.290 回答