2017-02-03 4 views
0

何度もグループに一致させたい。何度もシーケンスを一致させる

import re 
re.findall(r'\\x\w{2}',"echo -e '\\x6b\\x61\\x6d\\x69' random \\x6b\\x61") 
>> ['\\x6b', '\\x61', '\\x6d', '\\x69', '\\x6b', '\\x61'] 

これは私に予想される配列の結果を与えます。しかし、

re.findall(r'(\\x\w{2})+',"echo -e '\\x6b\\x61\\x6d\\x69' random \\x6b\\x61") 
>> ['\\x69', '\\x61'] 

つまり、16進数の各セットの最後の一致。私は+を持っていれば少なくとも一度はグループに合っていると思っていたが、これは明らかではない。私はこれが私に['\\x6b\\x61\\x6d\\x69','\\x6b\\x61']を与えてくれることを望んでいました。

私はここで何が間違っていますか?

あなたが +でパターンを繰り返すように ?:\\x\w{2}の非キャプチャグループを作成し、その後 ((?:\\x\w{2})+)\\x\w{2}として一つ以上の連続したパターンをキャプチャする必要があり、パターンを掛けキャプチャすることができます

答えて

1

re.findall(r'((?:\\x\w{2})+)',"echo -e '\\x6b\\x61\\x6d\\x69' random \\x6b\\x61") 

# ['\\x6b\\x61\\x6d\\x69', '\\x6b\\x61'] 
+0

私が間違っている場合は私を修正してください。この全体のどれもがグループを捕らえていない、それはキャプチャグループとして外側のパルテシスに焦点を当てているのだろうか? –

+1

非キャプチャグループは、直前の文字の代わりにパターン全体に '+'を適用するためのものです。外側のパターンをキャプチャしたいだけなので、内部グループ*を非キャプチャ*にする必要があります。 – Psidom

1

+がグループに含まれていないため。

>>> re.findall(r'((\\x\w{2})+)',"echo -e '\\x6b\\x61\\x6d\\x69' random \\x6b\\x61") 
[('\\x6b\\x61\\x6d\\x69', '\\x69'), ('\\x6b\\x61', '\\x61')] 

通常のかっこの非キャプチャ版を使用できます。

>>> re.findall(r'(?:\\x\w{2})+',"echo -e '\\x6b\\x61\\x6d\\x69' random \\x6b\\x61") 
['\\x6b\\x61\\x6d\\x69', '\\x6b\\x61'] 
関連する問題