我正在尝试从一行代码中提取所有函数调用,然后放入字符串列表中。例如,字符串:
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)
答案 0 :(得分:2)
您的模式使用字符类的替代形式,而没有一个仅与所列项中的一项匹配的量词。
重复捕获组时,该组包含上次迭代的值,这就是为什么看到这些匹配项的原因。
您可以将字符类编写为包含所有范围的单个字符类,然后重复该操作:
[a-zA-Z0-9]+\([^()]+\)
要匹配您的值,您可能还不匹配空格字符或括号,然后从左括号到右括号进行匹配,例如获得更广泛的匹配
[^\s()]+\([^()]+\)