0

我有 2 个字符串:

s7="ONE : TWO : THREE : FOUR : FIVE 30.1 : SIX 288.3 : SEVEN 1.9 : EIGHT 45.3 :"    
s8="ONE : TWO : THREE : FOUR 155.5 : FIVE 334.7 : SIX 6.7 : SEVEN 44.5 :"

我正在使用以下代码来解析它:

c=s.count(':')
if c==8:
    res=""
    res=s.split(' : ')
    res = [item.strip() for item in s.split(':')]
    for index, item in enumerate(res):
        print index, item
if c==7:
    res=""
    res=s.split(' : ')
    res = [item.strip() for item in s.split(':')]
    for index, item in enumerate(res):
        print index, item

我得到的这个输出是

>>> parse(s7)
0 ONE
1 TWO
2 THREE
3 FOUR
4 FIVE 30.1
5 SIX 288.3
6 SEVEN 1.9
7 EIGHT 45.3
8 
>>> parse(s8)
0 ONE
1 TWO
2 THREE
3 FOUR 155.5
4 FIVE 334.7
5 SIX 6.7
6 SEVEN 44.5
7 

如何从 s7 中的索引 4 到 7 和 s8 中的索引 3 到 6 中提取数值?我需要存储这些值,以便稍后将它们写入数据库。

我已经尝试了几件事,但它们不起作用。

请帮忙。

4

3 回答 3

2

总是这样吗?你可以简单地做:

s7="ONE : TWO : THREE : FOUR : FIVE 30.1 : SIX 288.3 : SEVEN 1.9 : EIGHT 45.3 :"
for elem in s7.split(' '):
    try:
        print elem
        total += float(elem)
    except:
        pass
s7 = total
>>> s7
365.6

并且做同样的事情s8

于 2013-04-12T07:25:36.160 回答
1

您可以在每个字符串上使用以下正则表达式:

[A-Z][ ]+([\d.]+)

对于每个字符串,您要查找的值将在第一个捕获的组中,如果不是空的。您可以在www.debuggex.com上确切地看到正在发生的事情。

完整代码:

import re

s7="ONE : TWO : THREE : FOUR : FIVE 30.1 : SIX 288.3 : SEVEN 1.9 : EIGHT 45.3 :"

def parse(s):
  res = s.split(' : ')
  matches = [re.search('[A-Z][ ]+([\d.]+)', x) for x in res]
  return [float(x.group(1)) for x in matches if x is not None]

print(parse(s7)) // prints "[30.1, 288.3, 1.9, 45.3]"
于 2013-04-12T07:26:17.460 回答
1

你也可以做一个列表理解。

假设字符串始终采用您提供的格式,那么这将起作用:

def parse(s):
    results = [float(x) for x in s.split(' ') if x.count('.') == 1]

>> [30.1, 288.3, 1.9, 45.3]

>> [155.5, 334.7, 6.7, 44.5]

这段代码说:

for every `x` in the split string, which I've split on whitespace, 
cast it to a float if x's count of `.` is 1.

在这里使用count()是有效的,因为如果它没有发现任何异常,它不会引发任何异常,.但是如果你想使用异常处理,那么index()它将是你正在寻找的那个。

于 2013-04-12T07:41:19.660 回答