【问题标题】:How to remove certain characters in a string without using replace or string.split() in python如何在 python 中不使用 replace 或 string.split() 删除字符串中的某些字符
【发布时间】:2021-10-14 04:06:18
【问题描述】:

我使用文件名作为字典键。

key_dict = {employee_details.csv : ["name","address","phone"]}

此字符串是从 AWS 中的 S3 存储桶中检索到的。 现在 ETL 生成的文件添加了版本号。 “employee_details_0_0_0.csv” 字符串的“_0_0_0”部分是一个动态值,将来可能会发生变化。说employee_details_1_2_3.csv。

如何在不添加版本的情况下正确获取文件名?

输入

input 1 : employee_details_0_0_0.csv
input 2 : employee_details_1_2_3.csv

输出

output 1 : employee_details.csv 
output 2 : employee_details.csv 

【问题讨论】:

    标签: python string replace filenames


    【解决方案1】:

    r"(_\d+){3}(?=\.csv)" 替换为""(参见demo

    >>> import re
    >>> filename = "employee_details_0_0_0.csv"
    >>> re.sub(r"(_\d+){3}(?=\.csv)", "", filename)
    'employee_details.csv'
    

    正则表达式解释:

    【讨论】:

    • (真正的小注意......捕获组也可以是非捕获组(?:,因为您不需要之后迭代中的最后一个捕获值:-))
    【解决方案2】:

    考虑到输入字符串,我们可以假设表示文件名的字符串部分是字母,版本控制部分是数字。 您可以使用过滤功能,以及拆分扩展名的路径

    from os import path    
    def clear_name(recived_name:str)-> str:
        is_not_number = lambda string: not string.replace(".","").isnumeric()
        name , ext = path.splitext(recived_name)
        return "_".join(filter(is_not_number, name.split("_")) ) + ext
    

    如果你同时应用两个输入,结果将是

    clear_name("employee_details_0_0_0.csv")
    output: 'employee_details.csv'
    
    clear_name("employee_details_1_2_3.csv")
    output: 'employee_details.csv'
    

    这个函数还可以删除浮点数:

    clear_name("employee_details_0.1.0.csv")
    output:  'employee_details.csv'
    

    如果您想了解更多关于os path look here的信息
    还有,filters docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 2021-01-23
      相关资源
      最近更新 更多