Python 正则表达式,按字符串中的整数计数报告位置

Python 正则表达式,按字符串中的整数计数报告位置,python,regex,Python,Regex,我正在努力解决一个问题。 我有一个类似“1d10m1m1m1m1m1d”的字符串,一个整数start=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 co

我正在努力解决一个问题。 我有一个类似“1d10m1m1m1m1m1d”的字符串,一个整数start=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)

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

>>> 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
更新


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

>>> 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
更新

带字符串:

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)
带字符串:

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)

是的,很好,这就是它应该如何工作的。非常感谢mateI为upvote赢得了15个声望点。如果我会在某个时候聚在一起,我会回来并且肯定会这样做我有一个字符串:“7S534M1D717M6I4863M10I2176M”我尝试过使用上面的代码,但它似乎不起作用properly@Irek,预计产量是多少?顺便说一句,新字符串包含原始字符串中未出现的Squestion@Irek,仅仅说它不起作用也无济于事。如果您提供预期结果、实际结果或错误、输入或代码来重现行为,您将有更高的机会获得答案。是的,很好,这正是它应该如何工作的。非常感谢mateI为upvote赢得了15个声望点。如果我会在某个时候聚在一起,我会回来并且肯定会这样做我有一个字符串:“7S534M1D717M6I4863M10I2176M”我尝试过使用上面的代码,但它似乎不起作用properly@Irek,预计产量是多少?顺便说一句,新字符串包含原始字符串中未出现的Squestion@Irek,仅仅说它不起作用也无济于事。如果你提供你的预期结果、实际结果或错误、输入或代码来重现行为,你将有更高的机会得到答案。除了I/D?S,M之外,可能会出现哪些字母。我想在我用你的代码检查我的数据之前,不会再出现其他字母了。现在好多了。然而,事实证明,如果有,则在计算I或D的位置时不应考虑它之前的整数。如果您使用任何类型的文档作为正则表达式,您可以将其传递给我,我不想用最简单的方法,只查看准备好的代码;\u;看,是的,Python文档。我知道这真的很好,但不知怎么的,我不太适应,除了I/D?s,M之外,还有哪些字母可能出现。我想不会再有什么了。我用你的代码检查了我的数据。现在好多了。然而,事实证明,如果有,则在计算I或D的位置时不应考虑它之前的整数。如果您使用任何类型的文档作为正则表达式,您可以将其传递给我,我不想用最简单的方法,只查看准备好的代码;\u;看,是的,Python文档。我知道这真的很好,但不知怎的,我和它相处得不太好