我尝试更改字符串,如s =' 2.3 ^ 2 + 3 ^ 3-√0.04* 2 +√4', 其中2.3 ^ 2必须改为pow(2.3,2),3 ^ 3 - pow(3,3),√0.04 - sqrt(0.04)和 √4 - sqrt(4)。
s='2.3^2+3^3-√0.04*2+√4'
patt1='[0-9]+\.[0-9]+\^[0-9]+|[0-9]+\^[0-9]'
patt2='√[0-9]+\.[0-9]+|√[0-9]+'
idx1=re.findall(patt1, s)
idx2=re.findall(patt2, s)
idx11=[]
idx22=[]
for i in range(len(idx1)):
idx11.append('pow('+idx1[i][:idx1[i].find('^')]+','+idx1[i][idx1[i].find('^')+1:]+')')
for i in range(len(idx2)):
idx22.append('sqrt('+idx2[i][idx2[i].find('√')+1:]+')')
for i in range(len(idx11)):
s=re.sub(idx1[i], idx11[i], s)
for i in range(len(idx22)):
s=re.sub(idx2[i], idx22[i], s)
print(s)
临时结果:
idx1=['2.3^2', '3^3']
idx2=['√0.04', '√4']
idx11=['pow(2.3,2)', 'pow(3,3)']
idx22=['sqrt(0.04)', 'sqrt(4)']
但字符串结果:
2.3^2+3^3-sqrt(0.04)*2+sqrt(4)
为什么计算' idx1'是的,但是不要将此值插入字符串中吗? (对不起我的英文:)
答案 0 :(得分:2)
仅使用re.sub()
输入字符串:
s='2.3^2+3^3-√0.04*2+√4'
替换pow()
s = re.sub("(\d+(?:\.\d+)?)\^(\d+)", "pow(\\1,\\2)", s)
替换sqrt()
s = re.sub("√(\d+(?:\.\d+)?)", "sqrt(\\1)", s)
输出:
pow(2.3,2)+pow(3,3)-sqrt(0.04)*2+sqrt(4)
()
表示群组捕获,\\1
表示首先从正则表达式匹配中捕获的群组。使用this link,您可以获得正则表达式的详细说明。
答案 1 :(得分:0)
我只有python 2.7.5,但这适用于我,使用str.replace
而不是re.sub
。一旦你努力寻找匹配并构建他们的替代品,这是一个简单的查找和替换工作:
for i in range(len(idx11)):
s = s.replace(idx1[i], idx11[i])
for i in range(len(idx22)):
s = s.replace(idx2[i], idx22[i])
我认为你是以一种啰嗦的方式解决这个问题。您可以一次使用re.sub
进行这些更改:
s = re.sub('(\d+(\.\d+)?)\^(\d+)', r'pow(\1,\3)', s)
将2.3^2+3^3
替换为pow(2.3,2)+pow(3,3)
并且:
s = re.sub('√(\d+(\.\d+)?)', r'sqrt(\1)', s)
将√0.04*2+√4
替换为sqrt(0.04)*2+sqrt(4)
这里有一些不同的东西。首先,\d
与数字匹配,与[0-9]
相同。其次,( )
捕获其中的任何内容。在替换中,您可以按照它们出现的顺序来引用这些捕获的组。在pow
示例中,我使用的是我捕获的第一组和第三组。
替换字符串前面的前缀r
表示该字符串将被视为“raw”,因此字符按字面解释。这些组可以通过\1
,\2
等进行访问,但由于反斜杠\
是转义字符,因此我每次都必须将其转义(\\1
,{{1没有\\2
。