Python 2.7重新搜索和findall提供不同的搜索结果

时间:2019-06-13 15:01:36

标签: regex 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 个答案:

答案 0 :(得分:2)

您的模式使用字符类的替代形式,而没有一个仅与所列项中的一项匹配的量词。

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

您可以将字符类编写为包含所有范围的单个字符类,然后重复该操作:

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

Regex demo

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

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

Regex demo