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()、文字列の末尾も分割します (引用符とスペースを削除します) が、3 番目の要素はそのままにしておきます。

最初の 2 つの要素を取得するために使用しようとしshlex.split(mystring)[0:2]ましたが、元の文字列から 3 番目の要素を抽出するための適切な解決策を見つけることができません。本当は引数付きのメソッド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属性は、解析対象のテキストを保持するファイルのようなオブジェクトであるため、最初の 2 つの引数を解析した後の残りの部分が含まれます。

ただし、プッシュバック状態にアクセスする必要がある可能性があります。ここでは、レキサーが参照したが、現在のトークンには必要のないトークンを格納します。

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