我正在尝试从一行代码中提取所有函数调用,然后将其放入字符串列表中。 例如,字符串:
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()]+([^()]+)
正则表达式演示