给定一个字符串,求其中连续数字所组成的数的总和

问题描述

给定一个字符串,求其中连续数字所组成的数的总和。例如:给定字符串"hello123world456",其中连续数字组成的数为123和456,题目要求的答案为579。

解决方法

方法一:纯字符串操作

对于一个字符串,我们可以用循环遍历的方式找出其中所有的数字,然后将其转化为整数,最后将所有的整数相加即可得到答案。

以下是使用纯字符串操作的代码实现:

def sum_of_numbers(string):

num_str = ""

ans = 0

for char in string:

if char.isdigit():

num_str += char

else:

if num_str:

ans += int(num_str)

num_str = ""

if num_str:

ans += int(num_str)

return ans

在上面的代码中,我们使用了循环遍历字符串中的每个字符。如果当前字符是一个数字,则将其加入到num_str中,num_str代表了当前找到的一个连续数字。当遇到一个非数字的字符时,如果此时num_str非空,说明之前发现了一段连续数字,于是将其转化为整数,并加到ans中。最后,如果num_str非空(即整个字符串以数字结尾),我们还要将其转化为整数,并加到ans中。最终的ans就是题目所要求的答案。

方法二:正则表达式

上面的做法比较麻烦,也容易写错。此时可以使用正则表达式来简化操作。正则表达式是一种用来描述文本模式的语言。通过正则表达式,我们可以方便地找出字符串中的一些模式,比如数字、字母、特殊字符等等。

以下是使用正则表达式的代码实现:

import re

def sum_of_numbers(string):

nums = re.findall(r"\d+", string)

return sum(map(int, nums))

在上面的代码中,我们使用了re模块中的findall函数来找出字符串中所有的数字。r"\d+"是一个正则表达式,表示匹配一个或多个数字。findall函数会返回一个列表,其中包含了所有匹配到的模式。最后使用map函数将所有的匹配到数字转化为整数,并求和得到答案。

测试样例

下面是一些测试样例:

assert sum_of_numbers("hello123world456") == 579

assert sum_of_numbers("abc") == 0

assert sum_of_numbers("123") == 123

assert sum_of_numbers("") == 0

assert sum_of_numbers("1a2b3c4d5e") == 15

总结

本题是一道比较简单的字符串操作题目。我们可以使用纯字符串操作或者正则表达式来解决这个问题。相比之下,使用正则表达式的代码更加简洁明了,推荐使用正则表达式来解决字符串匹配问题。

后端开发标签