Python正则表达式中的括号重复

Python正则表达式中的括号重复,python,regex,Python,Regex,我有以下字符串(假设变量名为“str”) 我想从中得到 ['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)'] 在Python中使用re.findall()函数 我尝试了以下方法 m = re.findall(r'TEST\s\((\d+\s?)*\)', str) 我得到了结果 ['148', '130']

我有以下字符串(假设变量名为“str”)

我想从中得到

['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)']
在Python中使用re.findall()函数

我尝试了以下方法

m = re.findall(r'TEST\s\((\d+\s?)*\)', str)
我得到了结果

['148', '130']
这是我想要的每一组数字的最后一个数字的列表。我不知道为什么我的regexp是错误的。有人能帮我解决这个问题吗


谢谢

不要使用重复的捕获组;将仅捕获最后一个值
re.findall()
仅在使用捕获的组时返回它们

在这里,一个不捕获重复的组会工作得更好:

m = re.findall(r'TEST\s\((?:\d+\s?)*\)', str)
演示:

如果没有捕获组,
re.findall()
将返回整个匹配。

您可以使用(不必担心中间的数字):


试试这个。在
TEST
之后,它将匹配每个字符,直到最后一个括号出现,并在那里停止(
[^]+
):

它产生:

['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)']
谢谢直到现在,我才意识到“捕获”和“非捕获”组。
>>> 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'TEST\s\((?:\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)']
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)']
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)']