2

我正在努力解决一个问题。我有一个像'1D10M1I10M1D'这样的字符串,一个整数开始= 10

我不知道如何使用字符串中的整数报告字符串中每个 I 或 D 的位置

我做了类似的事情:

 match = re.findall(r'(\d+)(\w)', a)
 print match

获取字符串和整数的单独值

我想输出如下:

1 D 10 #(it is the first D so its position (10) == value pos (10)
1 I 21 #(I counting from pos 10 + 1D + 10M = 21)
1 D 32 #(D counting from pos 10 + 1D + 10M +1I + 10M = 32)

你能帮我解决这个问题吗?

4

2 回答 2

4

这是你想要的吗?如果不是,请详细说明您的问题。

>>> import re
>>>
>>> a = '1D10M1I10M1D'
>>>
>>> start = 10
>>> for num1, i_or_d, num2, m in re.findall('(\d+)([ID])(\d+)?([A-Za-z])?', a):
...     print num1, i_or_d, start
...     if num1:
...         start += int(num1)
...     if num2:
...         start += int(num2)
...
1 D 10
1 I 21
1 D 32

更新

start = 10
for num1, i_or_d, num2, m in re.findall('(\d+)([IDS])(\d+)?([A-Za-z])?', a):
    if i_or_d not in 'ID':
        start += int(num1) + int(num2)
        continue
    print num1, i_or_d, start
    if num1:
        start += int(num1)
    if num2:
        start += int(num2)
于 2013-07-08T13:16:17.663 回答
0

带字符串:

a = '1D10M1I10M1D'

和起始位置:

start = 10

输出如预期:

1 D 10
1 I 21
1 D 32

但是,如果字符串不是以 I 或 D 事件开头,问题就开始了:

b = '7S534M1D717M6I4863M10I2176M'

起始位置为 10,输出应为:

1 D (10 + 534 + 7)  
6 I (10 + 534 + 7 + 1 +717)
10 I (10 + 534 + 7 + 1 + 717 + 6 + 4863)

缺少的是字符串中第一个 I 或 D 事件之前的整数,因此事件的输出位置不正确:

1 D 10
6 I 728
10 I 5597

编辑:

经过一些编辑后,代码将不包含“S”之前的整数并减去先前 ID 事件的长度:

import re

a = '7S534M1D717M6I4863M10I2176M'

start = 10
for num1, i_or_d, num2, m in re.findall('(\d+)([IDS])(\d+)?([A-Za-z])?', a):
    if i_or_d not in 'ID':
        start += int(num1) + int(num2)
        if i_or_d in 'S':
            start -= int(num1)
        continue
    print num1, i_or_d, start
    if num1:
        start += int(num1)
    if num2:
        start += int(num2) - int(num1)
于 2013-07-23T16:13:10.563 回答