我正在尝试使用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。有什么想法吗?
答案 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()
为我们提取参数。