从 Python 中的字符串中提取连续的数字字符
Extract continuous numeric characters from a string in Python
我有兴趣提取出现在一组字符 ('AA='
) 之后的数字。但是,问题是:(i) 我不知道数字有多长,(ii) 我不知道数字后面会出现什么(可能是空白 space 或除 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=
的起始位置,但这对上述条件不是很有帮助。另外,我知道一种方法是在 AA=
之后循环遍历每个字符,如果出现空白 space 或除 [0-9
,.
以外的任何字符,则中断, E
, -
] 被看到了,但那很笨拙并且在我的代码中使用了不必要的 space 。我正在寻找一种更简洁的方法。
这会给你想要的输出
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
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']
我有兴趣提取出现在一组字符 ('AA='
) 之后的数字。但是,问题是:(i) 我不知道数字有多长,(ii) 我不知道数字后面会出现什么(可能是空白 space 或除 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=
的起始位置,但这对上述条件不是很有帮助。另外,我知道一种方法是在 AA=
之后循环遍历每个字符,如果出现空白 space 或除 [0-9
,.
以外的任何字符,则中断, E
, -
] 被看到了,但那很笨拙并且在我的代码中使用了不必要的 space 。我正在寻找一种更简洁的方法。
这会给你想要的输出
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
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']