当前位置: 首页 > article >正文

Python 字符串分割时 spilt 和 re 效率对比

假设 有一些文件名是 数字_文档名 的格式,如何用python将数字提取出来?

可以使用 Python 的正则表达式模块 re 提取文件名中的数字部分。以下是实现代码:

示例代码:

import re

# 示例文件名列表
file_names = ["1_file1.txt", "2_file2.txt", "10_document.doc", "random_file.txt"]

# 提取文件名中的数字
numbers = [re.match(r"(\d+)_", file).group(1) for file in file_names if re.match(r"(\d+)_", file)]

# 输出结果
print(numbers)

输出结果:

['1', '2', '10']

代码解析:

  1. re.match(r"(\d+)_", file):

    • 使用正则表达式 (\d+)_ 匹配文件名开头的数字部分,(\d+) 表示提取一段连续的数字,后面跟着 _
    • 例如,对于 1_file1.txt,匹配结果是 1_,提取到的数字为 1
  2. .group(1):

    • 提取匹配的第一个捕获组 (\d+) 中的数字。
  3. if re.match(r"(\d+)_", file):

    • 过滤掉不符合 数字_文档名 格式的文件名,例如 random_file.txt
  4. 列表推导式:

    • 将提取的数字存储到一个新列表中。

示例扩展:

如果需要提取所有符合格式的文件的完整信息(包括文件名和数字),可以用以下方式:

files_with_numbers = [
    {"file": file, "number": re.match(r"(\d+)_", file).group(1)}
    for file in file_names
    if re.match(r"(\d+)_", file)
]

print(files_with_numbers)

输出:

[{'file': '1_file1.txt', 'number': '1'},
 {'file': '2_file2.txt', 'number': '2'},
 {'file': '10_document.doc', 'number': '10'}]

这样可以同时保留文件名和提取出的数字信息。

当然可以用 split 方法提取文件名中的数字部分,以下是使用 split 的方法:

示例代码:

# 示例文件名列表
file_names = ["1_file1.txt", "2_file2.txt", "10_document.doc", "random_file.txt"]

# 提取文件名中的数字部分
numbers = [file.split('_')[0] for file in file_names if '_' in file and file.split('_')[0].isdigit()]

# 输出结果
print(numbers)

输出结果:

['1', '2', '10']

代码解析:

  1. file.split('_')[0]:

    • 使用 _ 分割文件名,并提取分割后的第一个部分(假设为数字部分)。
    • 例如,对于 1_file1.txt,分割结果是 ['1', 'file1.txt'],提取的数字部分是 1
  2. if '_' in file:

    • 确保文件名包含 _,防止分割错误。
  3. file.split('_')[0].isdigit():

    • 检查分割后的第一部分是否是数字,以避免提取非数字部分。

示例扩展:

如果需要保留文件名和数字部分的信息,可以这样写:

files_with_numbers = [
    {"file": file, "number": file.split('_')[0]}
    for file in file_names
    if '_' in file and file.split('_')[0].isdigit()
]

print(files_with_numbers)

输出:

[{'file': '1_file1.txt', 'number': '1'},
 {'file': '2_file2.txt', 'number': '2'},
 {'file': '10_document.doc', 'number': '10'}]

这样可以同时提取出数字和完整文件名信息,逻辑更直观。

两种方法的效率主要取决于以下因素:

  1. split 方法:

    • 本质上是字符串的简单分割操作,直接基于分隔符 _ 将字符串拆分,时间复杂度接近 ( O(n) )(每次对字符串遍历)。
    • 性能非常高,对于较大的文件列表处理速度会非常快。
  2. re 正则表达式方法:

    • 正则表达式匹配包含了模式解析和匹配过程,涉及到模式编译和查找,其开销通常比字符串分割操作略大。
    • 对于简单的任务(如提取前缀数字),正则的效率略低于 split 方法。

实验对比

以下代码可以对两种方法的效率进行对比:

import time
import re

# 测试数据
file_names = ["1_file1.txt", "2_file2.txt", "10_document.doc", "random_file.txt"] * 10000

# 方法1:split方法
start_time = time.time()
numbers_split = [file.split('_')[0] for file in file_names if '_' in file and file.split('_')[0].isdigit()]
split_time = time.time() - start_time

# 方法2:正则表达式方法
start_time = time.time()
numbers_re = [re.match(r"(\d+)_", file).group(1) for file in file_names if re.match(r"(\d+)_", file)]
re_time = time.time() - start_time

# 输出耗时
print(f"Split方法耗时: {split_time:.6f} 秒")
print(f"正则表达式方法耗时: {re_time:.6f} 秒")

实验结果(示例):

假设处理 40,000 条数据:

Split方法耗时: 0.018秒
正则表达式方法耗时: 0.048秒

结论:

  • split 方法更高效,尤其是在处理大量数据时,字符串操作的开销更低。
  • 如果任务足够简单(例如提取 _ 前的数字部分),建议优先使用 split 方法。
  • 如果需要更复杂的匹配(例如提取多种格式),正则表达式的灵活性更强,但牺牲了性能。

因此,如果目标仅仅是提取 _ 前的数字,优先选择 split 方法。


http://www.kler.cn/a/507898.html

相关文章:

  • Spring框架 了解
  • 从AI原理到模型演进及代码实践 的学习二
  • 哪些新兴技术对智能驾驶汽车影响最大?
  • 文件上传 分片上传
  • 使用Newtonsoft.Json插件,打包至Windows平台显示不支持
  • C# 并发和并行的区别--16
  • 2021年前端部署的灵魂拷问
  • 快速入门:如何注册并使用GPT
  • 【数据分享】1929-2024年全球站点的逐年平均气温数据(Shp\Excel\无需转发)
  • 每日一题洛谷P1427 小鱼的数字游戏c++
  • cursor重构谷粒商城02——30分钟构建图书管理系统【cursor使用教程番外篇】
  • 第二天 了解HarmonyOS文档,关注分布式架构和微内核设计
  • LabVIEW 程序中的 R6025 错误
  • Java刷题 leetcode
  • Linux——文件系统
  • C++ QT中Q_Q和Q_D是什么?怎么使用?本质是什么?C++仿写
  • ChatGPT的新任务调度功能是 2025 年 AI 的一个良好开端
  • GraphRAG如何使用ollama提供的llm model 和Embedding model服务构建本地知识库
  • 深度学习 Pytorch 张量(Tensor)的创建和常用方法
  • ChatGPT大模型极简应用开发-CH1-初识 GPT-4 和 ChatGPT
  • adb 常用命令总结
  • 小程序适配底部安全距离
  • 静态综合路由实验
  • b站视频(网页加客户端)+本地视频 生成回链
  • Git克隆报错
  • 【Element Plus系列】解决 DatePicker 组件清空时,触发两次change