我希望多次匹配一个小组。
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']
。
我在这里做错了什么?
答案 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']