在Python中按值乘以字符串中的所有整数

时间:2017-04-13 19:24:26

标签: python regex string split

我需要将字符串中的每个整数乘以另一个数字,例如

In [1]: mystring = '2 apple trees yield 4 apples'
In [2]: myfunction(mystring, by = 2)

Out[3]:'4 apple trees yield 8 apples'

使用这样的字符串,使用正则表达式重新组合所需的输出并不是那么糟糕,但我希望能够处理这种情况:

In [1]: mystring = '(((((A:1,B:1):1,C:2):2,D:4):2,(((E:1,F:1):1,G:2):2,H:4):2):2,(((I:1,J:1):1,K:2):2,L:4):4):8;'
In [2]: myfunction(mystring, by = 0.5)

Out[3]:'(((((A:0.5,B:0.5):0.5,C:1):1,D:2):1,(((E:0.5,F:0.5):0.5,G:1):1,H:2):1):1,(((I:0.5,J:0.5):0.5,K:1):1,L:2):2):4;'

2 个答案:

答案 0 :(得分:3)

您可以使用re.sub替换所有整数。

def myfunction(mystring, by):
    return re.sub(
        re.compile("\d+"), 
        lambda matchobj: str(int(matchobj.group(0))*by), 
        mystring
        )

mystring = "(((((A:1,B:1):1,C:2):2,D:4):2,(((E:1,F:1):1,G:2):2,H:4):2):2,(((I:1,J:1):1,K:2):2,L:4):4):8;"
myfunction(mystring, by = 0.5)
'(((((A:0.5,B:0.5):0.5,C:1.0):1.0,D:2.0):1.0,(((E:0.5,F:0.5):0.5,G:1.0):1.0,H:2.0):1.0):1.0,(((I:0.5,J:0.5):0.5,K:1.0):1.0,L:2.0):2.0):4.0;'

答案 1 :(得分:0)

您可以使用itertools.groupby

from itertools import groupby

mystring = '(((((A:12,B:1):1,C:2...H:4):2):2'
multiplier = 5

groups = []
for is_digit, g in groupby(mystring, lambda x: x.isdigit()):
    group = ''.join(g)
    if is_digit:
        group = str(int(group) * multiplier)
    groups.append(group)

multiplied = ''.join(groups)
print(multiplied)

#(((((A:24,B:2):2,C:4):4,D:8):4