正则表达式帮助Python有选择地从数学表达式中删除括号

时间:2016-03-10 11:51:29

标签: python regex

以下是一些示例输入:

x(n)+(y(n)+1)*n
x(n(a,b),a,b)+2^(y(n(a,b)+a+b)+1)
x(n)+(y(n)/(N(n)))

我希望他们的相应输出为:

x[n]+(y[n]+1)*n
x[n[a,b],a,b]+2^(y[n[a,b]+a+b]+1)
x[n]+(y[n]/(N[n]))

我编写了以下代码,但它没有提供任何输出:

def replace():
    string='x(n)+2^(y(n)+1)'
    print re.sub(r'/(\w+)\(([^()]+)\)/', '\1[\2]', string)

1 个答案:

答案 0 :(得分:2)

PyPi regex module支持递归。您可以安装它并使用以下代码:

>>> import regex
>>> p = regex.compile(r'\b[a-zA-Z]\w*(\((?>[^()]|(?1))*\))')
>>> s = "x(n)+(y(n)+1)*n\nx(n(a,b),a,b)+2^(y(n(a,b)+a+b)+1)\nx(n)+(y(n)/(N(n)))"
>>> print(p.sub(lambda m: m.group().replace("(", "[").replace(")", "]"), s))
x[n]+(y[n]+1)*n
x[n[a,b],a,b]+2^(y[n[a,b]+a+b]+1)
x[n]+(y[n]/(N[n]))

regex demo is available here

\b[a-zA-Z]\w*匹配类似标识符的序列(以字母开头的整个单词,然后是可选的单词字符(数字,字母或下划线),(\((?>[^()]|(?1))*\))匹配嵌套的(...()...)序列感谢子程序调用{​​{1}}(递归,重复,第1组中的模式)。