首页 > 编程语言 >Python 字符串分割时 spilt 和 re 效率对比

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

时间:2025-01-17 22:28:13浏览次数:3  
标签:数字 Python re split file time txt spilt

假设 有一些文件名是 数字_文档名 的格式,如何用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 方法。

标签:数字,Python,re,split,file,time,txt,spilt
From: https://blog.csdn.net/lycwhu/article/details/145215754

相关文章

  • Tesla Free - Fall attack:特斯拉汽车网络安全攻击事件分析
    文章目录一、TeslaFree-Fallattack:特斯拉汽车网络安全事件纪要1.引言2.攻击流程2.1攻击切入点2.2系统入侵2.3CAN总线操控3.影响后果4.特斯拉应对措施5.研究意义二、安全攻击事件技术分析以及相应的检测和缓解措施一、TeslaFree-Fallattack:特斯拉......
  • THREE.js学习笔记8——Textures
    这个小节主要学习纹理,Texture纹理是覆盖几何形状表面的图像,不同类型的纹理具有多种不同的效果。这些纹理(尤其是金属性和粗糙度)遵循PBR原则基于物理的渲染许多技术往往遵循现实生活中的方向以获得现实的结果成为现实渲染的标准许多软件、引擎和库都在使用它如何加载纹理?......
  • [ARC108F] Paint Tree
    前言复习什么的就留到下周了,顺便把格式调好现在把每日一练打了差不多今天补了一下午的\(\rm{T2}\),终于还是被码力问题击碎了,不过也还好这道题是模拟赛\(\rm{T3}\)吉司机线段树和左偏树都只能明天搞了,明天把\(\rm{C}\)打了开摆思路首先那几个\(\rm{subtask}\)......
  • 前端GIS三维开发必备——WebGL&Three&Cesium知识框架
    WebGL知识框架以下是一个关于WebGL知识框架,从入门到进阶的详细详解,帮助你系统性学习WebGL开发。该框架分为基础、核心、进阶、优化与工具四个部分。ICE图形学社区一、基础知识1.什么是WebGLWebGL定义与用途基于OpenGLES2.0的JavaScriptAPI用于在浏览......
  • 【华为OD-E卷 - 数组连续和 100分(python、java、c++、js、c)】
    【华为OD-E卷-数组连续和100分(python、java、c++、js、c)】题目给定一个含有N个正整数的数组,求出有多少个连续区间(包括单个正整数),它们的和大于等于x输入描述第一行两个整数Nx(0<N<=100000,0<=x<=10000000)第二行有N个正整数(每个正整数小于等于100)输出......
  • python——句柄
    一、概念    句柄指的是操作系统为了标识和访问对象而提供的一个标识符,在操作系统中,每个对象都有一个唯一的句柄,通过句柄可以访问对象的属性和方法。例如文件、进程、窗口等都有句柄。在编程中,可以通过句柄来操作这些对象,从而实现对系统资源的控制和管理。二、实战1......
  • 【Nameko库】一个用于构建分布式系统的Python库
    1.微服务介绍微服务架构是一种将应用程序拆分为多个小型服务的方法,每个服务都可以独立开发、部署和扩展。这种架构使得应用程序更加模块化、可维护和可扩展。微服务架构的核心在于服务间的通信,主要有同步通信(如RESTful和RPC)和异步通信(如消息中间件)两种方式。典型的微服务架构有......
  • Python 自动识别验证码的详细指南
    验证码(CAPTCHA)广泛应用于在线表单和注册页面,旨在防止自动化攻击。尽管验证码设计旨在增加机器识别的难度,但借助光学字符识别(OCR)技术,我们仍然可以实现自动化的验证码识别。在本教程中,我们将使用Python编写一个简单的验证码识别程序,利用TesseractOCR引擎结合图像预处理技术提高......
  • Python 实现简单的验证码识别
    验证码是一种常见的验证机制,用来区分用户是人还是程序。在本教程中,我们将使用Python编写一个程序,通过图像处理和OCR技术自动识别英文数字组合的验证码。以下将逐步介绍如何实现这一功能。环境准备安装Python和必要库首先,确保已安装Python。如果未安装,可以前往Python......
  • 本地修改.gitignore而不影响远程仓库
    如何在本地修改.gitignore而不影响远程仓库在日常开发中,我们可能会需要对.gitignore文件进行本地修改,但又不希望这些改动被推送到远程仓库,影响团队协作。Git提供了一些机制,可以帮助我们实现这一需求。本文将介绍四种常用方法:assume-unchanged、skip-worktree、stash和chec......