用和替代可变数量的数字

时间:2019-08-23 08:36:32

标签: regex python-3.x

我需要找到一种方法来替换方括号中的n个数字(仅当这些方括号彼此相邻时)才用方括号中的这些数字之和代替;例如

  

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

成为:

  

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

我来到的最接近的正则表达式(首先用于匹配这些括号)是:

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

但是,使用此正则表达式,我只能匹配最后一次出现的情况(在上一个示例中:[3]和[5])。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

您可以使用

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 demo

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

此处,.(?:\[-?\d*\.?\d+]){2,}的两个或多个重复匹配,替换中的lambda表达式摆脱了第一个和最后一个[<NUMBER>][并用]获取转换为浮点数然后求和的数字列表。 ][中的{:g}会打印一个int(如果它是类似int的数字),或者将float值保持原样。