所以我把这个巨大的数学表达式存储在一个我从SymPy中获取的字符串中,并且我试图对它进行格式化,以便我可以在Mathematica中使用它。
我想将'sin(arg)'
的所有内容更改为Sin[arg]
,但我还需要让它适用于余弦。 arg
可以是theta1
,theta2
,theta3
,theta4
,theta5
。
字符串中有大量其他括号我不想替换,所以它只需要生成sin
和cos
括号。
对于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
替换压缩到正则表达式?
答案 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]'