【问题标题】:Python extract string starting with index up to characterPython从索引开始提取字符串直到字符
【发布时间】:2020-09-10 17:11:48
【问题描述】:

假设我有一个变化不大的传入字符串:

  1. " 1 |r|=1.2e10 |v|=2.4e10"
  2. " 12 |r|=-2.3e10 |v|=3.5e-04"
  3. "134 |r|= 3.2e10 |v|=4.3e05"

我需要提取数字(即 1.2e10、3.5e-04 等)...所以我想从 '|r|' 的末尾开始并将所有字符抓取到它之后的 ' ' (空格)。 '|v|' 也一样

我一直在寻找可以: 从从索引开始到特定字符结束的字符串中提取子字符串... 但是还没有发现任何远程接近的东西。 想法?

注意:添加了新场景,这是导致很多令人头疼的场景...

【问题讨论】:

  • 所以你想提取数字?您可以在= 处拆分字符串,然后在空格处再次拆分。您能给出您想要的输出吗?
  • “我需要提取 '5678'” - 我很困惑,因为 '5678' 没有出现在您的示例中。这甚至意味着什么?
  • 编辑了额外的场景并更新了所需的输出。

标签: python string substring extract


【解决方案1】:

为了保持优雅和通用,让我们使用split

  1. 首先,我们用 ' ' 分割成标记
  2. 然后我们判断它是否有等号并解析key-value
import re
sabich = "134 |r|     = 3.2e10 |v|=4.3e05"

parts = sabich.split(' |')
values = {}
for p in parts:
    if '=' in p:
        k, v = p.split('=')
        values[k.replace('|', '').strip()] = v.strip(' ')

# {'r': '3.2e10', 'v': '4.3e05'}
print(values)

这可以转换为单行:

import re
sabich = "134 |r|     = 3.2e10 |v|=4.3e05"

values = {t[0].replace('|', '').strip() :  t[1].strip(' ') for t in [tuple(p.split('=')) for p in sabich.split(' |') if '=' in p]}

# {'|r|': '1.2e10', '|v|': '2.4e10'}
print(values)

【讨论】:

  • 不错!我喜欢将值作为字典返回。
  • 谢谢@rcriii :)
  • 用另一种情况编辑了我的问题...这使得拆分“空格”字符成为一个问题...额外的空间可以用于任何 ||项目(每个字符串可能有 20 多个项目)
  • 虽然我没有使用您的解决方案,但在我的情况下,它是更复杂解析的最佳选择。但是,您确实为我指明了正确的方向。愚蠢的金发女郎就我而言,我最终只是在'='上进行了替换......
  • 谢谢@SamGrant!
【解决方案2】:

你可以用正则表达式解决它。

import re

strings = [
    "  1 |r|=1.2e10 |v|=2.4e10",
    " 12 |r|=-2.3e10 |v|=3.5e-04"
]

out = []
pattern = r'(?P<name>\|[\w]+\|)=(?P<value>-?\d+(?:\.\d*)(?:e-?\d*)?)'
for s in strings:
    out.append(dict(re.findall(pattern, s)))

print(out)

输出

[{'|r|': '1.2e10', '|v|': '2.4e10'}, {'|r|': '-2.3e10', '|v|': '3.5e-04'}]

如果你想将字符串转换为数字

out = []
pattern = r'(?P<name>\|[\w]+\|)=(?P<value>-?\d+(?:\.\d*)(?:e-?\d*)?)'
for s in strings:
    # out.append(dict(re.findall(pattern, s)))
    out.append({
        name: float(value)
        for name, value in re.findall(pattern, s)
    })

输出

[{'|r|': 12000000000.0, '|v|': 24000000000.0}, {'|r|': -23000000000.0, '|v|': 0.00035}]

【讨论】:

    猜你喜欢
    • 2016-01-09
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 2015-10-11
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多