/ / Wiederholte Klammern in regulären Ausdrücken von Python - Python, Regex

Parenthesized Wiederholungen in regulären Python-Ausdrücken - Python, Regex

Ich habe die folgende Zeichenfolge (der Variablenname lautet "str")

(((TEST (4 5 17 33 38 45 93 101 104 108 113 116 135 146 148)) (TRAIN (0 1 2 3 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 94 95 96 97 98 99 100 102 103 105 106 107 109 110 111 112 114 115 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 136 137 138 139 140 141 142 143 144 145 147 149 150 151))) ((TEST (19 35 46 47 48 56 59 61 65 69 71 84 105 107 130)) (TRAIN (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 36 37 38 39 40 41 42 43 44 45 49 50 51 52 53 54 55 57 58 60 62 63 64 66 67 68 70 72 73 74 75 76 77 78 79 80 81 82 83 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 106 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151)))"

von dem ich gerne bekommen würde

["TEST (4 5 17 33 38 45 93 101 104 108 113 116 135 146 148)", "TEST (19 35 46 47 48 56 59 61 65 69 71 84 105 107 130)"]

Verwenden der Funktion re.findall () in Python.

Ich habe Folgendes versucht

m = re.findall(r"TESTs((d+s?)*)", str)

für das ich das Ergebnis bekomme

["148", "130"]

Dies ist eine Liste nur der letzten Nummern jedes Nummernsatzes, den ich möchte. Ich weiß nicht, warum mein Regex falsch ist. Kann mir jemand bitte helfen, dieses Problem zu beheben?

Vielen Dank!

Antworten:

0 für die Antwort № 1

Verwenden Sie keine sich wiederholende Erfassungsgruppe. Nur der letzte Wert wird erfasst. re.findall() werden nur zurückgegebene Gruppen zurückgeben, wenn Sie sie verwenden.

Eine Gruppe ohne Capturing für die Wiederholung würde hier viel besser funktionieren:

m = re.findall(r"TESTs((?:d+s?)*)", str)

Demo:

>>> import re
>>> s = "(((TEST (4 5 17 33 38 45 93 101 104 108 113 116 135 146 148)) (TRAIN (0 1 2 3 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 34 35 36 37 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 94 95 96 97 98 99 100 102 103 105 106 107 109 110 111 112 114 115 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 136 137 138 139 140 141 142 143 144 145 147 149 150 151))) ((TEST (19 35 46 47 48 56 59 61 65 69 71 84 105 107 130)) (TRAIN (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 36 37 38 39 40 41 42 43 44 45 49 50 51 52 53 54 55 57 58 60 62 63 64 66 67 68 70 72 73 74 75 76 77 78 79 80 81 82 83 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 106 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151)))"
>>> re.findall(r"TESTs((?:d+s?)*)", s)
["TEST (4 5 17 33 38 45 93 101 104 108 113 116 135 146 148)", "TEST (19 35 46 47 48 56 59 61 65 69 71 84 105 107 130)"]

Ohne die Fanggruppe re.findall() gibt das gesamte Spiel zurück.


0 für die Antwort № 2

Sie können verwenden (ohne sich um die Ziffern dazwischen zu sorgen):

import re
print re.findall(r"((TEST.*?)))", s)
["TEST (4 5 17 33 38 45 93 101 104 108 113 116 135 146 148)", "TEST (19 35 46 47 48 56 59 61 65 69 71 84 105 107 130)"]

0 für die Antwort № 3

Probier diese. Nach dem TEST es stimmt mit jedem Zeichen überein, bis eine schließende Klammer erreicht wird, und endet dort ([^)]+):

re.findall(r"((TEST[^)]+))", s)

Es ergibt:

["TEST (4 5 17 33 38 45 93 101 104 108 113 116 135 146 148)",
"TEST (19 35 46 47 48 56 59 61 65 69 71 84 105 107 130)"]