2017-02-03 6 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'] 

т. Е. Последнее совпадение каждого набора шестнадцатеричных чисел. Я предположил, что наличие + будет соответствовать группе по крайней мере один раз, но это явно не так. Я надеялся, что это дало бы мне ['\\x6b\\x61\\x6d\\x69','\\x6b\\x61'].

Что я здесь сделал неправильно?

ответ

1

Вы можете сделать без захвата группы \\x\w{2} с ?: так, чтобы повторить рисунок с +, а затем захватить умножаются шаблон, ((?:\\x\w{2})+) должен захватить один или более непрерывный рисунок в виде \\x\w{2}:

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

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

Исправьте меня, если я ошибаюсь. Это целая группа не захватывает, так ли это, что она фокусируется на внешнем paranthesis в качестве группы захвата? –

+1

Группа без захвата предназначена для того, чтобы '+' применялся ко всему шаблону вместо символа непосредственно перед ним. И так как вы просто хотите захватить внешний шаблон, вам нужно сделать внутреннюю группу * non-capture *. – 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'] 
Смежные вопросы