Python 如何从多路径文件名中提取公共名称并删除我不知道的内容';我不想要

Python 如何从多路径文件名中提取公共名称并删除我不知道的内容';我不想要,python,text-extraction,Python,Text Extraction,例如,我有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 g

例如,我有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\U 84pp\U 2A\U MVP2”
不带编号
2
,拿
“GoodiesT0”
“GoodiesT0 HKJ DFG”
开始,先拿
“MIX”
“MIX-CMVP2\U Y1000-MIX”
开始,B/C我有很多文件都有不同的名称用于分隔零件,我也希望它是通用的

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))

所以基本上删除任何包含变化值的“列”,只保留保持不变的“列”?那么为什么CMVP*Y1000会被丢弃?这些有什么特别之处?在你的结果中,
2A
如何变成
3A
HKJ-DFG
?投票结束,因为你的例子毫无意义,请你发表评论,我已经把3A改为2A了。提取名称就是我现在想要的。CMVP*_Y1000被删除b/c这是我命名文件名的方式,也是HKJ-DFG我只是不需要那个。现在知道了吗?谢谢,谢谢。很好的方法。有没有可能我只能依靠下划线?例如,将文件名分隔为“g18_84pp_2A_MVP2”、“GoodiesT0”、“HKJ-DFG”、“MIX”、“CMVP2_Y1000-MIX”、“.txt”。B/C我有很多文件都有不同的名称来分隔部分。对,我只想取
“g18_84pp_2A_MVP2”
没有编号
2
,取
“GoodiesT0”
“GoodiesT0 HKJ DFG”中的
“MIX”
中的第一个
“MIX-CMVP2_Y1000-MIX”
@crystal那么为什么要取
(表达式,x))==3
其他值也给出相同的结果。