【问题标题】:Extract continuous numeric characters from a string in Python从Python中的字符串中提取连续的数字字符
【发布时间】:2021-01-15 22:30:48
【问题描述】:

我有兴趣提取出现在一组字符之后的数字 ('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.23451.23456781.21.2e-51.245e-7 对应上面的每一行。

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

【问题讨论】:

  • 简洁的方法是使用正则表达式,这就是他们发明的目的。从re module 开始。
  • @MarkRansom:谢谢,你能分享一个简单的相关例子吗?

标签: python string character numeric


【解决方案1】:

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

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

解释

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

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

【讨论】:

  • 有趣!谢谢!我被困在其他一些我之前忘记包含在我的问题中的地方。请参阅我更新的问题。请问4号线和5号线怎么处理?
  • 感谢您更新您的答案。对于以前从未使用过正则表达式的人来说,这种解释非常详尽且有帮助。谢谢!!
【解决方案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

【讨论】:

  • 这行得通!但是我被困在其他一些我之前忘记包含在我的问题中的地方。请参阅我更新的问题。 Line4 和 5 怎么处理?
猜你喜欢
  • 2021-12-31
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多