首页 > 解决方案 > 从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, -] 之外的任何内容,则中断,但这很笨拙,并且在我的代码中占用了不必要的空间。我正在寻找一种更简洁的方法来做到这一点。

标签: pythonstringcharacternumeric

解决方案


您可以将单个模式与捕获组一起使用。例如,使用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 演示


推荐阅读