【问题标题】:Multiply all integers in a string by value in Python在Python中将字符串中的所有整数乘以值
【发布时间】:2017-04-13 19:24:26
【问题描述】:

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

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;'

【问题讨论】:

  • 这是作业吗?
  • 你的代码在哪里,你有什么问题?
  • '(\d)+'分割字符串,收集片段列表。 findall() 原始字符串中的数字使用相同的 re,将每个片段转换为 int,相乘,再转换回 str(使用列表推导)。现在,压缩两个列表并将结果展平。
  • 你有一个实际数据结构的字符串表示。解析它,定义适当的映射函数并将其应用于结果,然后将其重新编码为新字符串。
  • this demo,你可以在lambda或回调方法中使用更复杂的逻辑。

标签: python regex string split


【解决方案1】:

您可以使用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;'

【讨论】:

  • 看,你有 C:1.0 而 OP 期望 C:1
  • @WiktorStribiżew 两者是同一个数字,这应该不是问题
  • 无论是工作还是完全通用的方法,如上面,可以返回浮点数比我的特定用途的整数更好。
【解决方案2】:

你可以使用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

【讨论】:

  • 这会在我的计算机上产生另一个(不正确的)结果。你确定这能正常工作吗?
  • 我刚刚又运行了一次...您使用了不同的字符串吗?我尝试了几种不同的方法,总能得到正确的结果。
  • 也许他的意思是您的示例程序和您的示例输出不匹配,否则按预期工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-29
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 2015-01-28
  • 2012-08-04
相关资源
最近更新 更多