我需要将字符串中的每个整数乘以另一个数字,例如
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;'
答案 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