首页 > 解决方案 > 用总和代替可变数量的数字

问题描述

我需要找到一种方法来替换方括号中的 n 个数字,只有当这些括号彼此相邻时,方括号中的这些数字的总和;例如

A[5][3]B[1.5]C[2.3][-1.3][5]

变成:

A[8]B[1.5]C[6]

我找到的最接近的正则表达式(首先匹配这些括号)是以下一个:

r'(\[[^\[\]]*\]){2,}'

但是,使用这个正则表达式,我只匹配最后一次出现(在前面的例子中:[3] 和 [5])。

有人可以帮助我吗?

标签: regexpython-3.x

解决方案


您可以使用

import re
s = "A[5][3]B[1.5]C[2.3][-1.3][5]"
rx = re.compile(r"(?:\[-?\d*\.?\d+]){2,}")
print( rx.sub(lambda m: "[{:g}]".format(sum([float(n) for n in m.group()[1:-1].split('][')])), s) )
# => A[8]B[1.5]C[6]

请参阅Python 演示

实际上,您甚至可以使用您的正则表达式尝试此代码,但请注意,它[^][]匹配任何 char 但][while-?\d*\.?\d+匹配可选-的 0+ 位、可选的.然后 1+ 位,因此匹配负数或正数 float 和 int 数。

在这里,(?:\[-?\d*\.?\d+]){2,}匹配 s 的两个或多个重复,[<NUMBER>]替换中的 lambda 表达式去掉第一个和最后一个[]拆分 with][以获得转换为浮点数然后求和的数字列表。{:g}如果它是一个类似 int 的数字,则在打印中str.format打印一个 int,或者保持浮点值不变。


推荐阅读