【问题标题】:split based on multiple numbers in python基于python中的多个数字拆分
【发布时间】:2018-08-02 13:19:41
【问题描述】:

您能帮我弄清楚如何根据多个/组数字作为分隔符进行拆分吗?

我的文件中有以下格式的内容:

data_file_10572_2018-02-15-12-57-29.file
header_file_13238_2018-02-15-12-57-48.file
sig_file1_17678_2018-02-15-12-57-14.file

预期输出:

data_file
header_file
sig_file1

我是 python 新手,我不确定如何根据数字组进行剪切。谢谢回复!!

【问题讨论】:

    标签: python python-3.x python-2.7


    【解决方案1】:

    如果您的所有文件名都遵循您描述的模式,则此代码将起作用。

    filename = 'data_file_10572_2018-02-15-12-57-29.file'
    parts = filename.split('_')
    new_filename = '_'.join(parts[:2])
    

    如果文件名的字母部分有可变数量的下划线,最好使用正则表达式。

    import re
    pattern = re.compile('_[0-9_-]{3,}.file$')
    re.sub(pattern, '', filename)
    

    输出:

    data_file
    

    基本上,首先,它创建一个以 _ 开头,后跟 3 个或更多数字,_ 或 - 并以 .file 结尾的模式。 然后,将遵循此模式的最大子字符串替换为空字符串。

    【讨论】:

    • 您好,没有图案。有时文件名就像 - archive_2725_2018-02-22-04-15-58.file archive_fl_data_725_2018-02-22-04-15-58.file
    【解决方案2】:

    我希望这会对你有所帮助。方法查找可以转换为整数的元素并返回一个字符串,直到该值。

    data = ['data_file_10572_2018-02-15-12-57-29.file', 'header_file_13238_2018-02-15-12-57-48.file', 'sig_file1_17678_2018-02-15-12-57-14.file']
    
    def split_before_int(elem):
        filename = elem.split('_')
        for part in filename:
            if not isinstance(part, (int)):
                    return '_'.join(filename[:filename.index(part)-2])
    
    for elem in data:
        print(split_before_int(elem))
    

    输出:

    data_file
    header_file
    sig_file1
    

    【讨论】:

    • 对于文件名 archive_2725_2018-02-22-04-15-58.filearchive_fl_data_725_2018-02-22-04-15-58.file 它返回 archivearchive_fl_data
    【解决方案3】:

    您可以将“_”与正则表达式一起使用,然后加入除最后一个以外的元素

    例如:

    import re
    a = "data_file_10572_2018-02-15-12-57-29.file"
    print "_".join(re.match("(.*?)_\d",a).group().split("_")[:-1])
    

    输出:

    data_file
    

    【讨论】:

    • 嗨,这个名字没有规律。有时文件名就像 - archive_2725_2018-02-22-04-15-58.file archive_fl_data_725_2018-02-22-04-15-58.file
    • 更新解决方案
    【解决方案4】:
    files = ['data_file_10572_2018-02-15-12-57-29.file', 'header_file_13238_2018-02-15-12-57-48.file','sig_file1_17678_2018-02-15-12-57-14.file']
    cleaned_files = list(map(lambda file: '_'.join(file.split('_')[0:2]), files))
    

    这会导致:

    ['data_file', 'header_file', 'sig_file1']
    

    【讨论】:

    • 嗨,这个名字没有规律。有时文件名就像 - archive_2725_2018-02-22-04-15-58.file archive_fl_data_725_2018-02-22-04-15-58.file
    • 您可以将 split('_') 中的下划线替换为一串数字,或者使用 Rakesh 的答案中的正则表达式。但我们很难提供仅根据您在问题中提供的详细信息来预测边缘案例的解决方案。
    【解决方案5】:

    首先index 获得_ 符号的第二个位置,然后python 列表部分索引(即list[0:5])获得一个子字符串直到第二个_ 的位置。

    【讨论】:

    • 感谢您的回复。但字符数可能不同,有时有archive_2725_2018-02-22-04-15-58.file archive_fl_data_725_2018-02-22-04-15-58.file
    猜你喜欢
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2012-02-27
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多