用函数参数

时间:2016-07-12 21:23:31

标签: python regex

所以我把这个巨大的数学表达式存储在一个我从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之外的其他功能吗?

P.S。有没有办法将sin -> Sin替换压缩到正则表达式?

4 个答案:

答案 0 :(得分:3)

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

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

我猜......也许......

答案 1 :(得分:1)

鉴于您的唯一参数可以是function tempRedirect(req, res) { var filename = req.params[0]; var contentDisposition = 'attachment; filename=data.jpg'; var params = { Bucket: S3_BUCKET, ResponseContentDisposition: contentDisposition, Key: checkTrailingSlash(getFileKeyDir(req)) + filename }; var s3 = new aws.S3(s3Options); s3.getSignedUrl('getObject', params, function(err, url) { res.redirect(url); }); }; theta1,您可以直接进行替换

theta5

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

Sin[\1]

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

Cos[\1] 是一个反向引用,从原始字符串中第一个匹配的带括号的组中获取值,在本例中为您的参数。

但我会选择Joran的答案。

答案 2 :(得分:1)

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)

答案 3 :(得分:0)

您可以使用外观(?<=...)和前瞻(?=...)来指定不会被消费(替换)的模式部分:

S = "cos(theta1)"

S = S.replace("cos","Cos").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)

assert S == 'Cos[theta1]'