1

シェル引数と同様の方法で引数を解析するための正規表現を作成しています。区切り文字としてスペースと引用符で囲まれた文字列を使用し、バックスラッシュをエスケープしています。これはRegexPalで機能するようです:

(?:(["'])(?:\\(?:\\\\)?\1|\\\\|.)*?\1|(?:\\(?:\\\\)?\s|\\\\|\S)+)

そのより読みやすいバージョンは次のとおりです。

(?:(["'])(?:        # 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に入れてみましたが、出力は意味がありません。

>>> 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は正規表現を何らかの方法で異なる方法で解釈しますか?空でない一致が二重引用符だけである理由はわかりません。パターン自体が正常に機能することを確認しました。

4

1 に答える 1

2

すべてが非キャプチャグループ内にあるように見えます。つまり、一致するコンテンツはなく、一致するものが得られます。

于 2011-06-24T20:33:49.107 に答える