问题描述
给定一个字符串,求其中连续数字所组成的数的总和。例如:给定字符串"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
总结
本题是一道比较简单的字符串操作题目。我们可以使用纯字符串操作或者正则表达式来解决这个问题。相比之下,使用正则表达式的代码更加简洁明了,推荐使用正则表达式来解决字符串匹配问题。