Python。关于芬德尔以及re.sub公司带“^”

2024-09-29 06:27:03 发布

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

我试图改变字符串,比如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-平方英尺(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)']

但是字符串结果:

^{pr2}$

为什么计算'idx1'是正确的,但是re.sub公司不将此值插入字符串? (对不起我的英语:)


Tags: 字符串inreforlenrangesqrtfind
2条回答

我只有Python2.7.5,但这对我很有用,使用str.replace而不是{}。一旦您开始寻找匹配项并构建它们的替换项,这是一个简单的查找和替换任务:

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进行以下更改:

^{pr2}$

{cd5>将取代{cd5}:

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\\2等)都必须转义,而不使用r。在

仅使用re.sub()尝试此操作

输入字符串:

s='2.3^2+3^3-√0.04*2+√4'

替换pow()

^{pr2}$

替换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可以获得正则表达式的详细说明。在

相关问题 更多 >