2017-02-03 3 views
0

Ich möchte eine Gruppe viele Male übereinstimmen.Match-Sequenz viele Male

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

was mir das erwartete Ergebnis eines Arrays gibt. Jedoch

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

d.h. die letzte Übereinstimmung jedes Satzes von Hexadezimalzahlen. Ich nahm an, dass die + zumindest einmal der Gruppe entsprechen würde, aber das ist eindeutig nicht der Fall. Ich hatte gehofft, dass dies mir ['\\x6b\\x61\\x6d\\x69','\\x6b\\x61'] gegeben hätte.

Was habe ich hier falsch gemacht?

Antwort

1

Sie eine Nicht-Capture-Gruppe von \\x\w{2} mit ?: machen können, um das Muster mit + zu wiederholen und dann fangen die Muster multipliziert, ((?:\\x\w{2})+) sollte ein oder mehr kontinuierlichen Muster erfassen, wie \\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

Korrigieren Sie mich, wenn ich falsch liege. Dieses ganze keine Capture-Gruppen, ist es so, dass es sich auf die äußere Paranthese als einfangende Gruppe konzentriert? –

+1

Die Non-Capture-Gruppe dient dazu, '+' auf das gesamte Muster anstatt auf das Zeichen direkt davor anzuwenden. Und da Sie nur das äußere Muster erfassen möchten, müssen Sie die innere Gruppe * nicht erfassen *. – Psidom

1

Da + nicht in der Gruppe.

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

Sie können eine nicht erfassende Version von regulären Klammern verwenden.

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