正则表达式矩阵的置换变元

2024-04-26 04:38:05 发布

您现在位置:Python中文网/ 问答频道 /正文

为了提高FORTRAN代码的性能,我希望对数组的索引进行置换,以便将第4个索引移到第二个位置,例如,我想更改下面的行

ts(l,i,j,k) = ts(l,i,j,k1(i,j))

^{pr2}$

注意,这只是一个例子行,指数并不总是被称为i,j,k,l。。。我只知道阵法的名字和等级。因此,我不能仅仅在逗号处分隔4个参数,因为一个单独的参数也可以是一个有逗号的矩阵(在上面的例子中k1(I,j))。所以我的第一个想法

^{3}$

在这种情况下失败(在上面的代码行中是rhs),因为它给出了:

ts(l,k,i,j) = ts(l,j),i,j,k1(i)

我需要的是一个正则表达式,它只在最多打开1个括号时拆分数组的索引。有人能告诉我如何使用sed/python/perl来实现这一点吗?在

致以最良好的祝愿


Tags: 代码参数情况矩阵k1数组指数性能
2条回答

也许直接regexp有点困难。如果有可用的脚本语言,请尝试以下操作。在您检测到包含数组访问的行之后。 (在python中)

import re
def getArguments(rhs):
    """
        Separates string on commas that are in the first level parentheses
    """
    lvl = 0
    argSplits = []
    for i, c in enumerate(rhs):
        if c == '(':
            lvl += 1
            if lvl == 1:
                argSplits.append(i)
        elif c == ')':
            lvl -= 1
            if lvl == 0:
                argSplits.append(i)
                break
        if lvl < 0:
            raise ValueError('Parentheses do not match')
        if lvl == 1:
            if c == ',':
                argSplits.append(i)
    args = []
    for i in range(len(argSplits)-1):
        args.append(rhs[argSplits[i]+1:argSplits[i+1]])
    return args

line = r'ts(l,i,j,k) = ts(l,i,j,k1(i,j))'
# get righthand side of equ
rhs = re.split('=', line)[1]   
# get arguments
args = getArguments(rhs)
# args = ['l', 'i', 'j', 'k1(i,j)']

# try: line = r'ts(l,i,j,k) = ts(l,i,j,k1(i(am(crazy(!))i),j))'
# you get: getArguments(rhs)  > ['l', 'i', 'j', 'k1(i(am(crazy(!))i),j)'

一旦有了参数列表,就可以在将字符串放回一起时对它们进行置换

如果括号的嵌套深度不超过您的示例中的深度,则此方法应该有效:

sed -r  's/ts\(((\([^()]*\)|[^(),])*),((\([^()]*\)|[^(),])*),((\([^()]*\)|[^(),])*),((\([^()]*\)|[^(),])*)\)/ts(\1,\7,\3,\5)/g' *.F

不是说它很漂亮。。。在

说明:

^{pr2}$

相关问题 更多 >