0

0

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

聖光之護

聖光之護

发布时间:2025-09-26 12:02:45

|

406人浏览过

|

来源于php中文网

原创

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

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

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

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

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

  1. isdigit方法误用:在条件判断中,input[0:1].isdigit被错误地使用,它仅仅引用了方法对象本身,而不是调用该方法。由于方法对象本身在布尔上下文中是“真值”(truthy),这导致了错误的逻辑判断。正确的调用方式应该是input[0].isdigit()。
  2. 冗余的条件判断:对于每种数字(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 # 如果没有找到任何数字,返回None

def 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免费学习笔记(深入)”;

Multiavatar
Multiavatar

Multiavatar是一个免费开源的多元文化头像生成器,可以生成高达120亿个虚拟头像

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

483

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

781

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1503

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

625

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

655

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

610

2024.04.29

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

33

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号