我需要找到一种方法来替换方括号中的n个数字(仅当这些方括号彼此相邻时)才用方括号中的这些数字之和代替;例如
A [5] [3] B [1.5] C [2.3] [-1.3] [5]
成为:
A [8] B [1.5] C [6]
我来到的最接近的正则表达式(首先用于匹配这些括号)是:
r'(\[[^\[\]]*\]){2,}'
但是,使用此正则表达式,我只能匹配最后一次出现的情况(在上一个示例中:[3]和[5])。
有人可以帮我吗?
答案 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值保持原样。