【问题标题】:How to extract a common name from multipal filenames and delete something I don't want如何从多个文件名中提取一个通用名称并删除我不想要的东西
【发布时间】:2013-07-16 14:44:00
【问题描述】:

例如,我有 7 个文件名为:

g18_84pp_2A_MVP1_GoodiesT0-HKJ-DFG_MIX-CMVP1_Y1000-MIX.txt
g18_84pp_2A_MVP2_GoodiesT0-HKJ-DFG_MIX-CMVP2_Y1000-MIX.txt
g18_84pp_2A_MVP3_GoodiesT0-HKJ-DFG_MIX-CMVP3_Y1000-MIX.txt
g18_84pp_2A_MVP4_GoodiesT0-HKJ-DFG_MIX-CMVP4_Y1000-MIX.txt
g18_84pp_2A_MVP5_GoodiesT0-HKJ-DFG_MIX-CMVP5_Y1000-MIX.txt
g18_84pp_2A_MVP6_GoodiesT0-HKJ-DFG_MIX-CMVP6_Y1000-MIX.txt
g18_84pp_2A_MVP7_GoodiesT0-HKJ-DFG_MIX-CMVP7_Y1000-MIX.txt

我想从这些文件中提取一个名字,命名为:

 g18_84pp_2A_MVP_GoodiesT0_MIX.txt

对此有什么想法吗?谢谢。

有没有可能我只能依赖下划线?

例如,将文件名分隔为

"g18_84pp_2A_MVP2", "_", "GoodiesT0-HKJ-DFG" "_", "MIX-CMVP2_Y1000-MIX", ".txt". 

"g18_84pp_2A_MVP2" 没有编号2,取"GoodiesT0" 取自"GoodiesT0-HKJ-DFG",先取"MIX" 取自"MIX-CMVP2_Y1000-MIX",B/C 我有很多文件有不同的名称用于分隔部分,我想要它通用的也好

【问题讨论】:

  • 所以基本上删除任何包含变化值的“列”,只保留保持不变的“列”?那么为什么 CMVP*_Y1000 会掉线呢?这些有什么特别之处? 2A 如何在您的结果中变为 3AHKJ-DFG 去哪儿了?投票结束,因为你的例子没有意义
  • 感谢您的评论,我已经将 3A 更改为 2A。提取名称是我现在想要的。 CMVP*_Y1000 被删除 b/c 这是我命名文件名的方式,也是 HKJ - DFG 我只是不需要那个。那么现在有什么想法了吗?谢谢。

标签: python text-extraction


【解决方案1】:
import re
names = ['g18_84pp_2A_MVP1_GoodiesT0-HKJ-DFG_MIX-CMVP1_Y1000-MIX.txt',
'g18_84pp_2A_MVP2_GoodiesT0-HKJ-DFG_MIX-CMVP2_Y1000-MIX.txt',
'g18_84pp_2A_MVP3_GoodiesT0-HKJ-DFG_MIX-CMVP3_Y1000-MIX.txt',
'g18_84pp_2A_MVP4_GoodiesT0-HKJ-DFG_MIX-CMVP4_Y1000-MIX.txt',
'g18_84pp_2A_MVP5_GoodiesT0-HKJ-DFG_MIX-CMVP5_Y1000-MIX.txt',
'g18_84pp_2A_MVP6_GoodiesT0-HKJ-DFG_MIX-CMVP6_Y1000-MIX.txt',
'g18_84pp_2A_MVP7_GoodiesT0-HKJ-DFG_MIX-CMVP7_Y1000-MIX.txt']

f = lambda x: re.findall('g18_84pp_2A_MVP(.*?)_GoodiesT0(.*?)_MIX(.*?)\.txt', x)

for x in names:
    print(f(x))

生产

[('1', '-HKJ-DFG', '-CMVP1_Y1000-MIX')]
[('2', '-HKJ-DFG', '-CMVP2_Y1000-MIX')]
[('3', '-HKJ-DFG', '-CMVP3_Y1000-MIX')]
[('4', '-HKJ-DFG', '-CMVP4_Y1000-MIX')]
[('5', '-HKJ-DFG', '-CMVP5_Y1000-MIX')]
[('6', '-HKJ-DFG', '-CMVP6_Y1000-MIX')]
[('7', '-HKJ-DFG', '-CMVP7_Y1000-MIX')]

过滤与此模式不匹配的名称:

names = list(filter(f, names))

由于不清楚您要做什么,这将是一个很好的起点。

更新

问题已更新。以下是您(可能)想要实现的目标:

import re
names = ['g18_84pp_2A_MVP1_GoodiesT0-HKJ-DFG_MIX-CMVP1_Y1000-MIX.txt',
'g18_84pp_2A_MVP2_GoodiesT0-HKJ-DFG_MIX-CMVP2_Y1000-MIX.txt',
'g18_84pp_2A_MVP3_GoodiesT0-HKJ-DFG_MIX-CMVP3_Y1000-MIX.txt',
'g18_84pp_2A_MVP4_GoodiesT0-HKJ-DFG_MIX-CMVP4_Y1000-MIX.txt',
'g18_84pp_2A_MVP5_GoodiesT0-HKJ-DFG_MIX-CMVP5_Y1000-MIX.txt',
'g18_84pp_2A_MVP6_GoodiesT0-HKJ-DFG_MIX-CMVP6_Y1000-MIX.txt',
'g18_84pp_2A_MVP7_GoodiesT0-HKJ-DFG_MIX-CMVP7_Y1000-MIX.txt']

expression = 'g18_84pp_2A_MVP(.*?)_Goodies(.*?)_MIX(.*?)\.txt'
f = lambda x: re.findall(expression, x)
_f = lambda x: len(re.findall(expression, x))==3

for x in names:
    print(f(x))

输出

[('1', 'T0-HKJ-DFG', '-CMVP1_Y1000-MIX')]
[('2', 'T0-HKJ-DFG', '-CMVP2_Y1000-MIX')]
[('3', 'T0-HKJ-DFG', '-CMVP3_Y1000-MIX')]
[('4', 'T0-HKJ-DFG', '-CMVP4_Y1000-MIX')]
[('5', 'T0-HKJ-DFG', '-CMVP5_Y1000-MIX')]
[('6', 'T0-HKJ-DFG', '-CMVP6_Y1000-MIX')]
[('7', 'T0-HKJ-DFG', '-CMVP7_Y1000-MIX')]

如果需要过滤原始列表:

names = list(filter(_f, names))

【讨论】:

  • 谢谢。非常好的方法。有没有可能我只能依赖下划线?例如,将文件名分隔为“g18_84pp_2A_MVP2”、“”、“GoodiesT0”、“-HKJ-DFG”“”、“MIX”、“-CMVP2_Y1000-MIX”、“.txt”。 B/C 我有很多文件有不同的名称来分隔部分。
  • 对,只是想取"g18_84pp_2A_MVP2" 没有号码2,从"GoodiesT0-HKJ-DFG""GoodiesT0",然后从"MIX-CMVP2_Y1000-MIX" 取第一个"MIX"
  • @crystalSo 为什么_f = lambda x: len(re.findall(expression, x))==3 其他值也给出相同的结果。
猜你喜欢
  • 2018-07-18
  • 1970-01-01
  • 2023-03-05
  • 2020-01-08
  • 2018-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多