私は、区切り文字としてスペースと引用符付きの文字列とバックスラッシュのエスケープ文字を使用して、引数を解析する正規表現を書いています。これはRegexPal上で動作するようです:Pythonの正規表現パターンから複数のマッチを取得する
(?:(["'])(?: # Match a double or single quote followed by
\\(?:\\\\)?\1 # an odd number of backslashes, then the same quote
|\\\\ # or two backslashes
|. # or anything else
)*?\1 # any number of times (lazily) followed by the same quote,
|(?: # OR
\\(?:\\\\)?\s # an odd number of backslashes, then whitespace
|\\\\ # or two backslashes
|\S # or any non-whitespace
)+ # any number of times.
)
私はre.findallでのPythonにこれを入れて試してみたが、出力はナンセンスです:
ここ(?:(["'])(?:\\(?:\\\\)?\1|\\\\|.)*?\1|(?:\\(?:\\\\)?\s|\\\\|\S)+)
は、その読みやすくバージョンです
>>> re.findall(
... r"(?:([\"'])(?:\\(?:\\\\)?\1|\\\\|.)*?\1|(?:\\(?:\\\\)?\s|\\\\|\S)+)",
... r'the quick brown\ fox jumps "over the" lazy\\ dog')
['', '', '', '', '"', '', '']
RegexPalは、他方で、正しい結果を示しています。
を[the] [quick] [brown\ fox] [jumps] ["over the"] [lazy\\] [dog]
私はパターンをPythonのための特定の方法でフォーマットするのを忘れていますか?あるいは、Pythonは正規表現を何らかの形で解釈しますか?なぜなら、空でない唯一の一致が二重引用符になるのはどういうことなのでしょうか?パターン自体がどうやって動作するのか確認しました。
shlexモジュールがあなたにとって興味深いかもしれません。 – PaulMcG
私はこのコードを書いていたときにshlexモジュールを使い始めましたが、私の目的には十分柔軟ではないことがわかりました。引数を分割して囲み引用符、バックスラッシュなどを保持できる必要があります。 – Fraxtil