如何在python中使用re.findall

如何在python中使用re.findall,python,regex,tuples,variable-assignment,multiple-return-values,Python,Regex,Tuples,Variable Assignment,Multiple Return Values,这是我的节目: 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+b或a+c,诸如此类。谁能告诉我怎么做 如果re.f

这是我的节目:

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+b
a+c
,诸如此类。谁能告诉我怎么做


如果
re.findall
无法解决我的问题,是否有其他方法可以实现此目标?

有一种更简单的方法,只需简单的循环检查

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()
casting


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

有一种更简单的方法,通过简单的循环检查

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()
casting


您的问题的问题是,如果您想将这些解析的数字分配给变量,您必须手动执行,这是不好的。如果您最终返回的数字数量是动态的,那么这将是非常乏味的,并且可能不可靠。您可能需要重新考虑此处的逻辑。

如果需要,您可以在LHS上使用元组分配:

a,b,c = re.findall(r'\d{1,100}', string)
这相当于写
(a,b,c)=……
;如果元组位于赋值的LHS上,则不再需要在元组周围加括号

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


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

如果您愿意,可以在LHS上使用元组赋值

a,b,c = re.findall(r'\d{1,100}', string)
这相当于写
(a,b,c)=……
;如果元组位于赋值的LHS上,则不再需要在元组周围加括号

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


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

此解决方案可能对re.findall的特定问题没有帮助,但这个解决方案将允许您进行所需的计算。使用字典:

>>>applesDict = {"My apples": 56, "Tom apples": 34, "Mary apples":222}
现在,您可以存储和求解任何计算

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

print c + d
>>> 90

这段代码可能效率不高,但容易理解,并且可以完成您需要的工作

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

>>>applesDict = {"My apples": 56, "Tom apples": 34, "Mary apples":222}
现在,您可以存储和求解任何计算

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

print c + d
>>> 90


这段代码可能效率不高,但容易理解,并且可以完成您需要的工作

apple[0]+apple[1]
有什么问题吗?如果你得到2个数字,或者7个?…或者根本没有。提示:永远不要调用一个字符串
string
,它会影响内置库(
导入字符串
)。调用字符串
s
,或其他任何操作。您可以只执行“\d+”来执行任意数量的数字(至少一个),而不是执行“\d{1100}”。我假设你没有100位的硬限制,你只想允许大的数字:)。苹果[0]+苹果[1]有什么问题吗?如果你得到2个数字,或者7个?或者根本没有。提示:永远不要调用字符串
string
,这会影响内置库(
import string
)。调用字符串
s
,或其他任何操作。您可以只执行“\d+”来执行任意数量的数字(至少一个),而不是执行“\d{1100}”。我假设你没有100位的硬限制,你只想允许大的数字:)。你根本不需要括号,不管是在左舵还是右舵。当然,除非您必须消除语法歧义,例如在函数调用中。在非常旧的2.x Python中,您过去需要括号。或者为了消除歧义,例如
(a,b,c)+(d,e)
不是
a,b,c+d,e
我想问一下Python的旧版本,因为我不确定。谢谢你把它清理干净。是的,有时你仍然需要它们来消除歧义(正如我们都说过的)。我知道什么时候需要括号,我只是不知道“现代”Python和Python2.x的旧版本在这方面有什么不同。你根本不需要括号,无论是在LHS还是RHS上。当然,除非您必须消除语法歧义,例如在函数调用中。在非常旧的2.x Python中,您过去需要括号。或者为了消除歧义,例如
(a,b,c)+(d,e)
不是
a,b,c+d,e
我想问一下Python的旧版本,因为我不确定。谢谢你把它清理干净。是的,有时你仍然需要它们来消除歧义(正如我们都说过的)。我知道什么时候需要括号,我只是不知道“现代”Python和Python2.x的旧版本在这方面有什么不同。