Regex将函数参数周围的()替换为[]

2024-10-01 07:36:26 发布

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

所以我把这个巨大的数学表达式存储在一个字符串中,我从SymPy那里得到的,我正在尝试格式化它,以便我可以在Mathematica中使用它。你知道吗

我想把所有看起来像'sin(arg)'的东西都改成Sin[arg],但我还需要让它对余弦起作用。arg可以是以下任何一种:theta1theta2theta3theta4theta5。你知道吗

字符串中还有很多我不想替换的括号,所以它只需要影响sincos括号。你知道吗

为了S = "cos(theta1)",我试过:

S = S.replace("cos", "Cos")
S = S.replace("sin", "Sin")
S = re.sub(r"Sin|Cos(\()theta1|theta2|theta3|theta4|theta5", "[", S)
S = re.sub(r"Sin|Cos\(theta1|theta2|theta3|theta4|theta5(\))", "]", S) 

S变成:

'[)'

我认为在\(\)之间使用括号意味着它只替换那些特定的组,但显然不是。除了re.sub之外,我还应该使用其他函数吗?你知道吗

另外,有没有办法将sin -> Sin替换内容压缩到regex中?你知道吗


Tags: 字符串rearg数学sincosreplace括号
3条回答
import re

if __name__ == '__main__':
    test = 'sin (theta1)'
    regex = (
        r'(sin|cos)'     # group # 1: sin or cos
        r'\s*'           # zero or more spaces
        r'\('            # opening bracket
        r'\s*'           # zero or more spaces
        r'(theta[1-5])'  # group #2 with your parameter
        r'\s*'           # zero or more spaces
        r'\)'            # closing bracket
        r'\s*'           # zero or more spaces
    )

    result = re.sub(regex, r'\1[\2]', test, ).capitalize()
    print(result)

假设您的参数只能是theta1theta5,您只需进行替换即可

sin\((theta[1-5])\)

Sin[\1]

以及

cos\((theta[1-5])\)

Cos[\1]

\1是一个backreference,它从原始字符串中第一个匹配的带圆括号的组中获取值,在本例中是您的参数。你知道吗

但我同意乔兰的回答。你知道吗

def replacer(m):
    return m.group(1).capitalize()+"["+m.group(2)+"]"

re.sub("([a-z]+)\(([a-zA-Z0-9 ]*)\)",replacer,"cos(Theta1)")

我想。。。也许 吧。。。你知道吗

相关问题 更多 >