Python 提取从索引开始到字符的字符串

Python extract string starting with index up to character

假设我有一个略有不同的传入字符串:

  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|”的末尾开始并在其后抓取直到 ' ' (space) 的所有字符。与“|v|”相同

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

注意:添加了新场景,这是引起很多人头疼的场景...

为了保持优雅和通用,让我们利用 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)

这可以转换为one-liner:

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)

可以用正则表达式解决

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}]