regex - 用总和代替可变数量的数字
问题描述
我需要找到一种方法来替换方括号中的 n 个数字,只有当这些括号彼此相邻时,方括号中的这些数字的总和;例如
A[5][3]B[1.5]C[2.3][-1.3][5]
变成:
A[8]B[1.5]C[6]
我找到的最接近的正则表达式(首先匹配这些括号)是以下一个:
r'(\[[^\[\]]*\]){2,}'
但是,使用这个正则表达式,我只匹配最后一次出现(在前面的例子中:[3] 和 [5])。
有人可以帮助我吗?
解决方案
您可以使用
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,或者保持浮点值不变。
推荐阅读
- java - 代码运行时出现异常,但在 DJL 上调试代码时没有
- python - 虚拟环境中的 Conda ModuleNotFoundError
- javascript - 为什么我的 Join DM 命令出现错误?
- c# - 当我想在 .NET 6 中添加添加身份系统时,“无法加载文件或程序集”
- c++ - Raspberry Pi GPIO 按钮作为键盘输入 C++
- windows - git bash 在每个命令上突然变慢,不仅是 git 命令
- c# - 日期检查程序
- nginx - 在 nginx 上使用 https ipaddress 阻止访问
- java - 如何为同一个 ModelMapper 使用不同的类型映射
- reactjs - VS Code - React、Typescript 和 Styled-components 修复语法高亮