Python字符串中数字与英文数字的智能提取与高效求和教程

Python字符串中数字与英文数字的智能提取与高效求和教程

本教程旨在解决Python中从混合字符串中提取首尾数字(包括数字字符和英文拼写数字)并进行求和的常见问题。我们将重点优化数字识别逻辑,纠正isdigit()方法的误用,并通过示例代码展示如何高效地实现这一功能,从而提升代码的可读性和执行效率。

字符串中混合数字的提取挑战

在处理包含文本和数字的字符串时,我们经常需要从中识别出数字信息。尤其是在某些编程挑战中,数字可能以两种形式出现:直接的数字字符(如’1′, ‘2’等)和英文拼写(如’one’, ‘two’等)。我们的目标是从每行文本中找出第一个和最后一个这样的数字,将它们组合成一个两位数,然后对所有这些两位数进行求和。

原始实现中存在两个主要问题:

isdigit方法误用:在条件判断中,input[0:1].isdigit被错误地使用,它仅仅引用了方法对象本身,而不是调用该方法。由于方法对象本身在布尔上下文中是“真值”(truthy),这导致了错误的逻辑判断。正确的调用方式应该是input[0].isdigit()。冗余的条件判断:对于每种数字(0-9),无论是数字字符还是英文拼写,都使用了独立的if/elif语句进行判断,这使得代码冗长且不易维护。

优化核心:高效数字识别函数

为了解决上述问题,我们可以设计更通用、更高效的数字识别函数。这些函数将能够从字符串的开头或结尾识别出数字或其英文拼写形式。

修正isdigit()方法与统一识别逻辑

首先,我们需要修正isdigit()的调用方式。其次,我们可以创建一个包含所有数字英文拼写的列表,然后通过遍历这个列表来检查字符串是否以某个数字词开头或结尾。这样可以大大简化if/elif结构。

def find_first_number(text_string):    """    从字符串的开头查找第一个数字(数字字符或英文拼写)。    例如:"oneight" -> 1, "2abc" -> 2    """    number_words = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]    # 遍历字符串,逐个字符检查    for i in range(len(text_string)):        current_substring = text_string[i:]        # 优先检查是否为数字字符        if current_substring[0].isdigit():            return int(current_substring[0])        # 检查是否为英文拼写数字        for value, word in enumerate(number_words):            if current_substring.startswith(word):                return value    return None # 如果没有找到任何数字,返回Nonedef find_last_number(text_string):    """    从字符串的结尾查找最后一个数字(数字字符或英文拼写)。    例如:"oneight" -> 8, "abc2" -> 2    """    number_words = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]    # 从字符串末尾开始向前遍历    for i in range(len(text_string) - 1, -1, -1):        current_substring = text_string[:i+1] # 每次截取从开头到当前位置的子串        # 优先检查是否为数字字符        if current_substring[-1].isdigit():            return int(current_substring[-1])        # 检查是否为英文拼写数字        for value, word in enumerate(number_words):            if current_substring.endswith(word):                return value    return None # 如果没有找到任何数字,返回None

代码解析:

立即学习“Python免费学习笔记(深入)”;

number_words列表存储了数字的英文拼写。enumerate可以方便地获取索引(即数字值)和对应的单词。find_first_number通过for i in range(len(text_string))迭代字符串,每次检查从当前位置i开始的子串。current_substring[0].isdigit():检查子串的第一个字符是否为数字。current_substring.startswith(word):检查子串是否以某个英文数字词开头。find_last_number通过for i in range(len(text_string) – 1, -1, -1)从字符串末尾向前迭代。每次截取从开头到当前位置i+1的子串。current_substring[-1].isdigit():检查子串的最后一个字符是否为数字。current_substring.endswith(word):检查子串是否以某个英文数字词结尾。这两个函数都返回找到的第一个(或最后一个)数字的整数值,如果没有找到则返回None。

整合与最终求和

有了高效的数字提取函数,我们可以将其整合到主程序中,处理文件中的每一行并计算总和。

def concatenate_numbers(num1, num2):    """将两个数字拼接成一个整数"""    return int(f"{num1}{num2}")def process_calibration_document(file_path):    """    处理校准文档,提取每行的首尾数字并求和。    """    total_sum = 0    try:        with open(file_path, 'r') as f:            for line in f:                line = line.strip() # 移除行尾的换行符和空格                if not line: # 跳过空行                    continue                first_digit = find_first_number(line)                last_digit = find_last_number(line)                if first_digit is not None and last_digit is not None:                    combined_number = concatenate_numbers(first_digit, last_digit)                    total_sum += combined_number                else:                    print(f"警告: 无法从 '{line}' 中提取首尾数字。")        return total_sum    except FileNotFoundError:        print(f"错误: 文件 '{file_path}' 未找到。")        return 0    except Exception as e:        print(f"处理文件时发生错误: {e}")        return 0# 示例用法if __name__ == "__main__":    document_path = 'textdocument.txt' # 确保文件存在且路径正确    final_result = process_calibration_document(document_path)    print(f"最终的校准总和为: {final_result}")

注意事项与最佳实践:

变量命名:避免使用Python内置函数名(如input, sum)作为变量名,以免造成混淆或覆盖内置功能。在示例中,我们使用了text_string, total_sum等更清晰的名称。文件处理:使用with open(…) as f:是处理文件的最佳实践,它能确保文件在操作结束后被正确关闭,即使发生错误。错误处理:增加了try-except块来处理文件未找到或其他潜在的运行时错误,提高了程序的健壮性。strip()方法:line.strip()用于移除每行末尾可能存在的换行符或其他空白字符,确保数字识别的准确性。f-string:在concatenate_numbers函数中使用了f-string(f”{num1}{num2}”)来拼接数字,这种方式简洁且高效。代码可读性:通过将不同的逻辑拆分为独立的函数,如find_first_number、find_last_number和concatenate_numbers,大大提高了代码的可读性和模块化程度。

总结

通过对isdigit()方法的正确调用以及采用列表和循环来统一处理数字字符和英文拼写数字,我们成功地优化了从复杂字符串中提取数字的逻辑。这种改进不仅使代码更加简洁、易读,而且提高了其可维护性和效率。在实际开发中,理解并应用这些优化技巧,对于处理文本数据和解决类似的编程挑战至关重要。正确识别并修正代码中的细微错误,如方法调用遗漏括号,是提升编程技能的关键一步。

以上就是Python字符串中数字与英文数字的智能提取与高效求和教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1373829.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 13:36:33
下一篇 2025年12月14日 13:36:45

相关推荐

  • Tkinter中非文件源PhotoImage的缩放技巧:Pillow集成方案

    本教程详细阐述如何在不依赖文件读取的情况下,对程序化生成的Tkinter PhotoImage进行缩放。通过引入Pillow库,我们可以将原始像素数据转换为Pillow图像对象,利用其强大的图像处理能力进行尺寸调整,再转换为Tkinter可用的PhotoImage,从而解决Tkinter原生Phot…

    好文分享 2025年12月14日
    000
  • Pandas DataFrame中按组填充缺失日期行:构建完整时间序列数据

    本教程详细讲解如何在Pandas DataFrame中,针对每个分组(如产品键),高效地填充缺失的日期行以构建完整的时间序列数据。通过结合使用groupby、date_range、reindex以及数据填充策略,文章将指导读者如何将稀疏数据转换为连续且结构化的数据,并处理缺失值,确保数据分析的准确性…

    2025年12月14日
    000
  • 深入理解NumPy多维数组的维度顺序与内存布局

    NumPy多维数组的维度顺序理解是高效使用其功能的关键。默认情况下,NumPy采用C语言风格的行主序(C-order),即在内存中,数组的最后一个维度变化最快。这意味着对于np.ones((A, B, C)),它被视为A个B×C的矩阵,且C维度元素在内存中是连续的。此外,NumPy也支持Fortra…

    2025年12月14日
    000
  • 深入理解Python类运算符重载:为何@classmethod无效而元类奏效

    Python中,直接在类上使用@classmethod重载运算符(如__matmul__)或特殊方法(如__getattr__)不会使其对类对象本身生效,因为运算符查找发生在类的类型(通常是type)上。要实现类对象自身的运算符行为或属性访问,需要通过定义元类来在类的类型层次上提供这些特殊方法,从而…

    2025年12月14日
    000
  • Python Beautiful Soup4:高效解析HTML下拉菜单数据

    本教程详细介绍了如何使用Python的requests和BeautifulSoup4库从复杂的HTML下拉菜单中准确抓取数据。文章首先分析了在HTML解析中常见的错误,特别是如何正确选择目标元素并提取其文本内容。通过一个具体的案例,教程演示了如何定位特定的元素,进而遍历其中的子项,并利用get_te…

    2025年12月14日
    000
  • 使用 kr8s 库将 Kubernetes 资源导出为 YAML 清单

    本文详细介绍了如何利用 kr8s Python 库将 Kubernetes 集群中的现有资源导出为 YAML 清单。通过调用资源对象的 to_dict() 方法获取其字典表示,并结合 pyyaml 库的 safe_dump() 函数,用户可以轻松地将集群状态逆向转换为可读的 YAML 格式,便于备份…

    2025年12月14日
    000
  • Tkinter程序化生成图像的缩放策略:Pillow库的深度应用

    本文探讨了如何在Tkinter中高效缩放非文件生成的PhotoImage。鉴于Tkinter原生PhotoImage在缩放方面的局限性,尤其对于程序化生成的像素数据,我们提出了一种结合Pillow库的解决方案。该方案利用Pillow的Image对象存储并处理像素数据,实现灵活的尺寸调整,随后通过Im…

    2025年12月14日
    000
  • python logging如何输出到文件_python logging日志模块输出到文件配置

    Python logging通过配置FileHandler将日志输出到文件,可设置编码、格式和级别;使用RotatingFileHandler或TimedRotatingFileHandler实现按大小或时间滚动日志,避免文件过大;多线程下logging自带线程安全,多进程需用QueueHandle…

    2025年12月14日
    000
  • Flask应用调试模式配置详解

    本文详细介绍了在Flask应用中启用调试模式的两种主要方法:通过设置环境变量和通过代码进行配置。我们将探讨这两种方法的具体操作步骤、适用场景以及注意事项,帮助开发者在Windows PowerShell环境下正确开启调试模式,从而提高开发效率并规避潜在风险。 理解Flask调试模式的重要性 在fla…

    2025年12月14日
    000
  • 解决F2PY与Meson构建中LNK2019链接错误的指南

    本文旨在解决使用F2PY和Meson构建Python扩展模块时遇到的LNK2019链接错误。该错误通常源于Fortran和C代码编译时使用的运行时库不一致,特别是在Windows环境下。教程将深入分析错误原因,并提供通过修改Meson构建文件来统一运行时库设置的解决方案,确保混合语言模块的成功构建。…

    2025年12月14日
    000
  • Python中将2D列向量转换为1D向量以计算Pearson相关系数

    本文旨在解决在Python中使用scipy.stats.pearsonr计算Pearson相关系数时,因输入数据为2D列向量而非1D向量所导致的维度和长度错误。教程将详细介绍如何通过numpy库的.ravel()、.flatten()、.reshape(-1)等方法将2D列向量转换为1D,并强调在处…

    2025年12月14日
    000
  • 利用PyQt扩展QPdfView:实现交互式PDF矩形标注功能

    本文详细介绍了如何通过继承QPdfView类,在PyQt应用程序中实现交互式矩形绘制功能,允许用户直接在PDF文档上拖动鼠标来创建和调整矩形标注。教程涵盖了自定义状态管理、鼠标事件处理以及关键的渲染刷新机制,特别强调了使用self.viewport().repaint()来解决绘制内容不立即显示的问…

    2025年12月14日
    000
  • Flask应用调试模式的配置与实践

    本文详细介绍了在Flask应用中启用调试模式的两种主要方法:通过配置环境变量(FLASK_APP和FLASK_DEBUG)配合flask run命令运行,以及直接在Python代码中使用app.run(debug=True)启动应用。教程将提供清晰的步骤、示例代码,并特别针对Windows Powe…

    2025年12月14日
    000
  • Flask调试模式启用指南:两种高效配置方法详解

    本教程详细介绍了在Flask应用中启用调试模式的两种主要方法:通过设置环境变量和直接在代码中配置。我们将提供清晰的步骤和示例代码,帮助开发者在Windows PowerShell及其他环境中正确激活调试功能,从而提高开发效率并便于错误排查,同时强调生产环境禁用调试模式的重要性。 为什么需要调试模式?…

    2025年12月14日
    000
  • Python函数调用:处理字典参数多于函数形参的技巧

    当使用**kwargs将字典作为参数传递给Python函数时,如果字典包含的键多于函数显式定义的形参,会导致TypeError。本教程将介绍如何通过在函数内部接受**kwargs并利用kwargs.get()方法安全地提取所需参数,从而优雅地解决这一问题,实现灵活的函数参数处理。 1. 问题背景:T…

    2025年12月14日
    000
  • Robocorp Browser库截图超时解决方案:利用重试机制提升稳定性

    本教程旨在解决Robocorp Browser库中take_screenshot函数可能出现的超时错误。通过分析该错误常发生在元素稳定等待阶段,我们发现其类似于相机对焦,易受干扰。核心解决方案是引入重试机制,当截图操作失败时自动重新尝试,有效提升自动化流程的健壮性与成功率。 理解Robocorp B…

    2025年12月14日
    000
  • Tkinter中程序生成图像的高效缩放与显示

    本文探讨了在Tkinter应用中,如何对非文件来源、程序算法生成的PhotoImage进行高效缩放。针对tkinter.PhotoImage自身不直接支持缩放的限制,教程提供了一种专业解决方案:利用Pillow库的Image对象存储像素数据,进行任意尺寸调整,再转换为ImageTk.PhotoIma…

    2025年12月14日
    000
  • Tkinter Canvas标签使用指南:避免数字标签冲突与实现绘图撤销功能

    本文深入探讨了Tkinter Canvas中标签使用的一个常见陷阱:纯数字标签与画布项ID的冲突。我们将详细解释为何纯数字标签不可用,并提供一个简单而有效的解决方案——为数字标签添加字符串前缀。通过一个交互式绘图板的撤销功能实现为例,演示如何正确应用此方法,确保标签功能正常运作,从而构建更健壮的Tk…

    2025年12月14日
    000
  • Python函数参数处理:如何安全地从超集字典中提取特定参数

    当使用**kwargs将字典作为参数传递给Python函数时,如果字典包含函数未显式定义的额外键,将导致TypeError。解决此问题的方法是,在函数定义中也使用**kwargs来捕获所有传入的关键字参数,然后在函数内部通过kwargs.get()方法安全地按需提取所需的参数,从而有效避免错误并提高…

    2025年12月14日
    000
  • Python函数参数解包:使用kwargs灵活处理多余字典参数

    当使用**kwargs将字典解包传递给Python函数时,如果字典包含比函数形参更多的键,会导致TypeError。本教程将展示如何通过在函数定义中使用**kwargs捕获所有传入的关键字参数,并在函数内部从kwargs字典中按需提取所需参数,从而优雅地解决此问题,提高函数的灵活性和鲁棒性。 问题背…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信