python - 从Python中的字符串中提取连续的数字字符
问题描述
我有兴趣提取出现在一组字符 ( 'AA='
) 之后的数字。但是,问题是:(i)我不知道数字有多长,(ii)我不知道数字后面出现的内容(可能是空格或除 0-9 之外的任何字符,请考虑我不知道这些字符可能是什么,但它们绝对不是 0-9),(iii)数字可以以指数形式出现(下面的第 4/5 行)
下面给出了我可以拥有的许多输入中的几个。
Line 1: 123 NUBA AA=1.2345 $BB=1234.55
Line 2: 123 NUBA MM AA=1.2345678&BB=1234.55
Line 3: 123 NUBA RRNJH AA=1.2#ALPHA
Line 4: 123 NUBA ABCD AA=1.2E-5 GBRO
Line 5: 123 NUBA ABCD AA=1.245E-7$ MN
...
结果应该是:1.2345
1.2345678
1.2
1.2e-5
1.245e-7
对于上面的每一行。
PS:我知道如何使用.find
和获取起始位置,AA=
但这对上述情况帮助不大。另外,我知道一种方法可能是在 after 之后循环遍历每个字符,AA=
如果看到空格或除 [ 0-9
, .
, E
, -
] 之外的任何内容,则中断,但这很笨拙,并且在我的代码中占用了不必要的空间。我正在寻找一种更简洁的方法来做到这一点。
解决方案
您可以将单个模式与捕获组一起使用。例如,使用re.findall仅获取捕获组的值。
\bAA=(\d+(?:\.\d+)?(?:[eE][-+]?[0-9]+)?)
解释
\bAA=
一个单词边界,然后匹配AA=
(
捕获组 1\d+
匹配 1+ 个数字(?:\.\d+)?
匹配可选的小数部分(?:[eE][-+]?[0-9]+)?
匹配可选的指数部分
)
关闭组 1
import re
regex = r"\bAA=(\d+(?:\.\d+)?(?:[eE][-+]?[0-9]+)?)"
s = ("Line 1: 123 NUBA AA=1.2345 $BB=1234.55\n"
"Line 2: 123 NUBA MM AA=1.2345678&BB=1234.55\n"
"Line 3: 123 NUBA RRNJH AA=1.2#ALPHA\n"
"Line 4: 123 NUBA ABCD AA=1.2E-5 GBRO\n"
"Line 5: 123 NUBA ABCD AA=1.245E-7$ MN")
print(re.findall(regex, s))
输出
['1.2345', '1.2345678', '1.2', '1.2E-5', '1.245E-7']
推荐阅读
- python - Python在树中逐对查找所有交点
- spring - 如何将请求数据从 Spring Boot 控制器传递到 Apache Camel 路由
- c - 关于内存进程和函数共享的问题
- bash - 使用 awk 和 bash 进行 vlookup:大数据速度慢
- android - 如何在 Android Studio 中自定义数据绑定字段?
- flutter - 如何使用flutter adyen支付网关?
- arrays - 将列值从 1 更改为 0
- html - 角材料扩展面板内的下拉菜单被切断
- reactjs - 反应警告:在 StrictMode 中不推荐使用 findDOMNode
- networking - 如何从主机访问 Kubernetes 集群?