在Python中从字符串中提取连续数字字符

2024-05-15 11:45:06 发布

您现在位置: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{}{}{}{}对于上面的每一行

PS:我知道如何使用.find并获取AA=的起始位置,但这对上述条件没有多大帮助。另外,我知道有一种方法可以是在AA=之后循环每个字符,如果看到空格或除[0-9.E-]以外的任何内容,则将其打断,但这很笨拙,并且在我的代码中占用了不必要的空间。我正在寻找一个更整洁的方法来做这件事


Tags: 方法line数字指数字符空白感兴趣形式
2条回答

这将为您提供所需的输出

import re

string1 = '123 NUBA AA=1.2345 $BB=1234.55'
string2 = '123 NUBA MM AA=1.2345678&BB=1234.55'
string3 = '123 NUBA RRNJH AA=1.2#ALPHA'

re.findall(r'\d+\.*\d*', string1[string1.find("AA="):])[0]
re.findall(r'\d+\.*\d*', string2[string2.find("AA="):])[0]
re.findall(r'\d+\.*\d*', string3[string3.find("AA="):])[0]

输出

1.2345
1.2345678
1.2

您可以将单个模式与捕获组一起使用。例如,使用re.findall仅获取捕获组的值

\bAA=(\d+(?:\.\d+)?(?:[eE][-+]?[0-9]+)?)

解释

  • \bAA=一个单词边界,然后匹配AA=
  • (捕获组1
    • \d+匹配1+个数字
    • (?:\.\d+)?匹配可选的小数部分
    • (?:[eE][-+]?[0-9]+)?匹配可选的指数部分
  • )关闭组1

Regex demo

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 demo

相关问题 更多 >