1

这是我的程序:

import re
string = "I have 56 apples, Tom has 34 apples, Mary has 222 apples"

apple = re.findall(r'\d{1,100}', string)
print (apple)

结果是:

['56', '34', '222']

我想命名上面的三个数字,以便我可以进行一些计算。我还想命名第一个结果a,第二个b,第三个c。然后计算a+bor a+c,类似的东西。谁能告诉我该怎么做。

如果re.findall不能在这里解决我的情况,还有其他方法可以实现这个目标吗?

4

3 回答 3

2

有一个更简单的方法,一个简单的循环检查。

string = "I have 56 apples, Tom has 34 apples, Mary has 222 apples"
x = [int(num) for num in string.split() if num.isdigit()]

>>> x
[56, 34, 222]

这将拆分字符串并检查它是否为数字,并将其返回到列表中。如果您希望这些数字在字符串中(我不明白为什么,如果它是一个数字,就让它成为一个数字)然后删除int()铸件。

你的问题的问题是,如果你想将这些解析的数字分配给变量,你必须手动完成,这很糟糕。如果您最终返回了动态数量的数字,这将非常乏味并且可能不可靠。您可能需要重新考虑这里的逻辑。

于 2016-11-22T05:20:21.333 回答
2

如果需要,可以在 LHS 上使用元组赋值:

a,b,c = re.findall(r'\d{1,100}', string)

这相当于写作(a,b,c) = ...;如果它位于作业的 LHS 上,您不再需要在元组周围加上括号。

正如@SterlingArcher 所说,这是一种糟糕的编码风格,因为除非你得到三个项目,或者如果你的字符串不好,或者正则表达式失败,你会得到一个错误。

一种策略是使用尾随_作为无关变量来吸收任何额外的项目:a,b,c,_ = ...但是如果您的字符串或正则表达式没有提供至少三个项目,这仍然会中断。

于 2016-11-22T06:46:10.100 回答
0

此解决方案可能无法解决 re.findall 的特定问题,但此解决方案将允许您进行所需的计算。使用字典:

>>>applesDict = {"My apples": 56, "Tom apples": 34, "Mary apples":222}

现在您可以存储和求解任何计算。

>>>c = applesDict["My apples"]
>>>d = applesDict["Tom apples"]

print c + d
>>> 90

此代码可能效率不高,但易于理解并可以完成您需要的工作。

于 2017-05-07T23:19:11.880 回答