多次匹配序列

时间:2017-02-03 03:40:57

标签: python regex

我希望多次匹配一个小组。

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']

我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

您可以使用\\x\w{2}创建?:的非捕获组,以便使用+重复该模式,然后捕获相乘的模式,{ {1}}应将一个或多个连续模式捕获为((?:\\x\w{2})+)

\\x\w{2}

答案 1 :(得分: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']