Python 2.7 重新搜索和查找都提供了不同的搜索结果



我正在尝试从一行代码中提取所有函数调用,然后将其放入字符串列表中。 例如,字符串:

z = x + cos(x + y) - sin(x+2) + 3;

应该解析为

['cos(x+y)','sin(x+2)']

使用 python 2.7 的 re.search 函数和正则表达式

searchString = '([a-z]|[A-Z]|[0-9])+?[(].*?[)]'

我可以按预期提取第一个函数cos(x+y)

当我改用findall时,我确实得到了两个字符串的列表,但它们只包含(之前的字符。 也就是说,我得到['s','n']

由于我的正则表达式适用于search,我对findall做错了什么?

我正在使用的功能是:

'''Separates out all function calls'''
def separateFunctionCalls(str):
    searchString = "([a-z]|[A-Z]|[0-9])+?[(].*?[)]"
    grp = re.findall(searchString,str)
    usingSearch = re.search(searchString,str)
    print usingSearch.group(0)
    print grp

测试代码是:

str = "return 2*cos(x+y) + sin(x+2)+1.0;"
separateFunctionCalls(str)

您的模式使用没有量词的字符类交替,该量词仅与列出的 1 个项目匹配。

重复捕获组时,该组包含上次迭代的值,这就是您看到这些匹配项的原因。

您可以将字符类

编写为包含所有范围的单个字符类,然后重复此操作:

[a-zA-Z0-9]+([^()]+)

正则表达式演示

为了匹配您的值,您还可以匹配不带空格字符或括号,然后从左括号到右括号进行匹配,以获得例如更广泛的匹配

[^s()]+([^()]+)

正则表达式演示