Python提取字符串数字并求和的两种实现方法

Evan
Evan
发布时间:2026-10-11| 3人浏览过
原创

在Python开发中,从混合文本中提取数值并进行计算是常见需求。本文介绍两种实现方式:利用正则表达式精准匹配浮点数,以及通过手动遍历字符处理连续小数点等边界情况。

方法一:使用正则表达式(推荐)

利用 re 模块的 findall 函数,可以高效地提取字符串中的所有浮点数。该方法避免了手动处理状态标记的复杂性,且能自动处理连续小数点等异常情况。

import re

def extract_and_sum_regex(text):
    # 匹配整数或浮点数
    numbers = re.findall(r'\d+\.?\d*', text)
    # 将提取的字符串转换为浮点数并求和
    total = sum(float(num) for num in numbers)
    return total

# 测试用例
text = "43...3y2.f67se2.666."
result = extract_and_sum_regex(text)
print(f"提取的数字列表: {re.findall(r'\d+\.?\d*', text)}")
print(f"求和结果: {result}")

该方法的优点在于代码简洁,且 re.findall 默认行为能较好地处理连续非数字字符。需要注意的是,正则表达式 \d+\.?\d* 会匹配如 "43"、"3"、"2"、"67"、"2.666" 等有效数值,忽略字母和多余的小数点。

方法二:手动遍历字符

如果不依赖正则表达式,可以通过遍历字符串中的每个字符,利用状态变量判断当前是否处于数字提取过程中。这种方法需要手动处理连续小数点、字母分隔符等边界情况。

def extract_and_sum_manual(text):
    sum_val = 0
    number = ""
    is_num = "0123456789"
    is_has_float = False
    isstart = False
    
    for a in text:
        if a in is_num:
            if isstart == True:
                number = number + a
            else:
                number = number + a
                isstart = True
            continue
        
        if a == '.':
            if isstart == True:
                if is_has_float == True:
                    # 已有小数点,忽略后续小数点
                    pass
                else:
                    is_has_float = True
                    number = number + a
                    continue
        
        # 当遇到非数字且非小数点字符,或字符串结束时,处理已提取的数字
        if isstart == True:
            # 去除可能存在的末尾多余小数点
            clean_num = number.strip('.')
            if clean_num:  # 确保提取到有效数字
                print(clean_num)
                sum_val = sum_val + float(clean_num)
            # 重置状态
            number = ""
            isstart = False
            is_has_float = False
    
    # 处理字符串末尾的数字
    if isstart == True:
        clean_num = number.strip(".")
        if clean_num:
            print(clean_num)
            sum_val = sum_val + float(clean_num)
            
    return sum_val

# 测试用例
text = "43...3y2.f67se2.666."
result = extract_and_sum_manual(text)

该方法通过 isstart 标记是否开始提取数字,is_has_float 标记是否已遇到小数点。当遇到字母或多余小数点时,将当前 number 转换为浮点数加入总和,并重置状态。此方法逻辑较为繁琐,容易遗漏边界情况(如连续小数点的处理),建议优先使用正则表达式方法。

注意事项

  • 数据清洗:手动遍历方法中,strip('.') 用于去除末尾多余的小数点,但无法处理中间的多余小数点(如 "1.2.3" 会被解析为 "1.2" 和 "3",具体取决于实现)。正则表达式方法通常更可靠。
  • 类型转换:提取的数字字符串需使用 float() 转换为浮点数后再求和,避免字符串拼接。
  • 空值处理:在手动遍历中,需判断 clean_num 是否为空,避免将空字符串转换为浮点数引发错误。
以上就是Python提取字符串数字并求和的详细内容,更多关于Python字符串处理、正则表达式应用及数值计算的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。