3

我正在尝试使用 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)")

但这不起作用,因为组()*没有扩展到许多项目,而只使用了最后一个。有任何想法吗?

4

1 回答 1

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不会尝试使用它来启动匹配组),然后是文字 string cmd,然后是匹配任何文字)字符的匹配组; 然后匹配组用 a 关闭,)并且有一个文字)来匹配)完成函数调用的实际值。在此模式匹配后,匹配对象将组 1 设置为仅来自函数调用的有趣参数。

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

于 2012-06-04T23:06:38.247 回答