Python 使用一个组匹配多个子字符串的正则表达式?

Python 使用一个组匹配多个子字符串的正则表达式?,python,regex,Python,Regex,我试图用Python中的正则表达式解析一个元素数目未知的字符串。以下是一个例子: >>>> import re >>>> re.match("\=( A([0-9]+))*", "= A1 A2 A3 A4").groups()[1::2] ('4',) 我希望: ('1', '2', '3', '4',) 我怎样才能得到预期的结果 编辑: re.findall对我不起作用。让我举一个更好的例子: 我要匹配以下字符串: \u func(cmd、

我试图用Python中的正则表达式解析一个元素数目未知的字符串。以下是一个例子:

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

('1', '2', '3', '4',)
我怎样才能得到预期的结果

编辑:

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

我要匹配以下字符串:

\u func(cmd、param1、param2、param3、param4)_
我事先不知道参数的数量。我希望使用以下代码来解决它:

>>> re.match("(\w+)\(cmd(, (\w+))*\)", "func(cmd, param1, param2, param3, param4)")
但这不起作用,因为组
()*
不会扩展到许多项,而是只使用最后一项。有什么想法吗

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\u recognize\u args
查找带有文本
(在模式中是反斜杠转义的,因此
re
不会尝试使用它来启动匹配组)的文本字符串
func
,然后是匹配组,匹配到文本
字符;然后用一个
关闭匹配组,并且在那里有一个文本
来匹配完成函数调用的实际
。在这个模式匹配之后,match对象将把group1设置为函数调用中的有趣参数


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

安装ipython(pip install ipython),导入're'模块(import re),然后查看文档(?re.match,?re.search,?re.findall)。你的评论毫无用处。你认为我在问之前没有读过所有这些吗?-1。是的,我想是的,你的问题得出了这个结论。我建议你把你的无知留在家里,接受更礼貌的态度。@Vidul Petrov:堆栈溢出有一些规则。如果你知道答案-答案,如果你不-不,如果你不理解问题-询问更多信息。不要在没有回答的情况下让用户看手册(这是不礼貌的!)。毕竟,我的问题并不琐碎,人们发现没有直接的解决办法。你根本没有给出答案!最后,在StackOverflow上,我们没有-1个问题,只是因为我们无法回答,并且我们在没有任何解决方案的情况下将用户指向手册。这对我不起作用,因为我也需要匹配=符号。我将编辑我的问题,使其更具说服力。难道没有一种方法可以在一个问题中完成吗?我的原始正则表达式要复杂得多,需要将其拆分为几个匹配项:
re.match(//JS/Py-API-prototype:(\w+)\(self(*,*(\w+)(\=*([0-9]+\124; None | False | True))?)*”,functionPrototype)
,在谷歌搜索了更多的内容后,我发现在Python中一步就不可能做到这一点。Perl 6和.NET提供了一种方法,但这是RegEx的一个特定扩展,它不是标准化的。谢谢你的两步回答。很容易建立一个匹配组,将一大堆东西收集到一个字符串中。很容易建立一个收集一件东西的比赛小组。但我不知道有什么方法可以生成一个模式,该模式返回可变数量的匹配组。我不知道为什么要用一种模式来做,因为看起来最痛苦的事情就是识别函数调用,而收集参数非常简单(基本上就是用逗号分开)。正则表达式可以足够复杂,而不需要尽可能复杂;使用两个简单的模式比使用一个怪物要好。@steveha回答得好,我有一个问题:为什么我们需要
?:
这样它才能工作?