RegEx用于使用一个组匹配多个子字符串?

时间:2012-06-04 23:01:05

标签: python regex

我正在尝试使用Python中的RegEx解析具有未知数量元素的字符串。这是一个例子:

>>>> import re
>>>> re.match("\=( A([0-9]+))*", "= A1 A2 A3 A4").groups()[1::2]
('4',)

我希望有:

('1', '2', '3', '4',)

如何获得预期结果?

修改

re.findall对我不起作用。让我举个更好的例子:

我想匹配以下字符串:

_func(cmd, param1, param2, param3, param4)_

我事先并不知道参数的数量。我希望使用以下代码解决它:

>>> re.match("(\w+)\(cmd(, (\w+))*\)", "func(cmd, param1, param2, param3, param4)")

但是这不起作用,因为组()*没有扩展到很多项,但只使用了last。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

pat = re.compile(r' A(\d+)')
lst = re.findall(pat, "= A1 A2 A3 A4")

这将返回一个列表,在您的示例中,您显示了一个元组。我认为列表对你有用,但你当然可以这样做:

t = tuple(lst)

我刚刚给出的答案实际上并未检查输入字符串中的=。如果您需要这样做,您可以始终使用两种模式和两个步骤:

pat0 = re.compile(r'=(?: A\d+)+')
pat1 = re.compile(r' A(\d+)')

m = pat0.search("= A1 A2 A3 A4")
if not m:
    print("input string not what was expected")
else:
    s = m.group(0)
    lst = re.findall(pat, s)

编辑:处理func()示例的代码:

s_code = "func(cmd, param1, param2, param3, param4)"
pat_recognize_args = re.compile(r'func\(cmd([^)]*)\)')
pat_parse_args = re.compile(r'[, ]+([^, ]+)')

m = pat_recognize_args.search(s_code)
if m:
    s = m.group(1)
    lst = re.findall(pat_parse_args, s)

当我运行上述代码时,lst设置为:['param1', 'param2', 'param3', 'param4']

pat_recognize_args查找带有文字func的文字字符串((在模式中使用反斜杠转义,因此re不会尝试使用它来启动一个匹配组),然后是文字字符串cmd,然后匹配一个匹配文字)字符的匹配组;然后匹配组以)结束,文字)与完成函数调用的实际)相匹配。在此模式匹配之后,匹配对象将组1设置为函数调用中的有趣参数。

接下来我们设置s = m.group(1),然后让re.findall()为我们提取参数。