2011-06-24 9 views
1

私は、区切り文字としてスペースと引用符付きの文字列とバックスラッシュのエスケープ文字を使用して、引数を解析する正規表現を書いています。これは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は正規表現を何らかの形で解釈しますか?なぜなら、空でない唯一の一致が二重引用符になるのはどういうことなのでしょうか?パターン自体がどうやって動作するのか確認しました。

+0

shlexモジュールがあなたにとって興味深いかもしれません。 – PaulMcG

+0

私はこのコードを書いていたときにshlexモジュールを使い始めましたが、私の目的には十分柔軟ではないことがわかりました。引数を分割して囲み引用符、バックスラッシュなどを保持できる必要があります。 – Fraxtil

答えて

2

すべてが非キャプチャグループ内にあるようです。だから、あなたは一致を取得し、一致するコンテンツはありません。

+0

一番外側のグループをキャプチャしようとしましたが、それは内部の後方参照を破ります。それを修正する方法が分かっているなら( '\ 1'を' \ 2'に変更しようとしましたが、役に立たない)、私はすべて耳にします。 – Fraxtil

+2

@Fraxtilでは、後方参照にはカッコが付いています。最初の開き括弧は '\ 1'で、2番目の括弧は' \ 2'です。 – stema

+0

なぜ最初に動作しなかったのか分かりませんが、先頭の '?:'を取り除き、もう一度 '\ 1'を' \ 2'に置き換えると、今度は完璧に動作します。ありがとうございました! – Fraxtil

関連する問題