【问题标题】:How to scale all numbers in a string while keeping the format the same in Python? [closed]如何在 Python 中保持格式相同的同时缩放字符串中的所有数字? [关闭]
【发布时间】:2014-12-23 16:43:53
【问题描述】:

我需要一种方法,将字符串中的所有数字乘以另一个数字,同时保持字符串的结构和格式。可以吗?

例如:

my_var = """Cat, 5, kg 

Dog, 10, kg

Human, 50, kg"""

给定这个字符串,我希望能够将 5、10 和 50 乘以保存在其他变量中的另一个数字。

multiplier = 2.0/10 # or 0.2

所以我想使用multipliermy_var 来创建一个新字符串:

"""Cat, 1, kg

Dog, 2, kg

Human, 10, kg"""

然后我会输出给用户。

任何帮助将不胜感激!

【问题讨论】:

  • 面向对象的解决方案在这里可能会很好。将每个字符串反序列化为具有namemassunits属性的Animal对象;然后将每个动物的质量乘以2/10;然后重新序列化回字符串。
  • 先试一行。创建一个字符串'Cat, 5, kg',并计算出如何使用逗号split it,如何使用int 转换为整数,并使用', '.join(values) 重新加入。
  • @Kevin documentation for namedtuple 会很有帮助。
  • 你有没有尝试实现一些东西?如果是,请告诉我们。
  • Kevin 和 Peter Wood-嗨 Kevin 和 Peter,这就是我的想法,但我不确定如何将它们重新序列化回字符串。

标签: python string variables integer multiplication


【解决方案1】:

带有自定义替换函数的正则表达式似乎很适合这项任务。

我们可以找到字符串中的所有数字,将它们转换为整数并对它们执行一些算术运算。之后需要将它们转换回字符串来替换之前的文本。

import re

text = '''
Cat, 5 kg
Dog, 10 kg
Human, 50 kg
'''.strip()

def divide_numbers(s, n):
    def sub(m):
        return str(int(m.group(0))//n)
    return re.sub('[0-9]+', sub, s)

print(divide_numbers(text, 5))

猫,1 公斤
狗,2 公斤
人类,10 公斤

请注意,小数部分在这里随处可见。您可能想使用float 代替int/ 代替//(整数除法)。

这里正则表达式的另一个有趣的优点是您可以使您的模式更高级以仅匹配一些数字。这里我们只匹配" kg"后面的数字,我改成float提到的

def divide_numbers(s, n):
    def sub(m):
        return str(float(m.group(1))/n)
    return re.sub('([0-9]+) kg', sub, s)

【讨论】:

  • 非常感谢!这已经奏效了,但是如果你能给我解释一下代码是如何工作的,是否有可能,因为我知道你可以创建你的表达式,我理解这段代码中的点点滴滴,但是是否可以向我解释代码是如何进一步工作的?某些词在代码中的含义,例如 m.group(0) 和 re.sub 以及 "([0-9]+)kg", sub, s)
猜你喜欢
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多