使用Python,如何替换基于匹配的片段的部分路径?

使用Python,如何替换基于匹配的片段的部分路径?,python,Python,我有一个路径看起来像:data/dev-noise-subtractive-250ms-1/1988/24833/1988-24833-0013.flac 我想做的是替换第二部分,使其成为data/dev clean/1988/24833/1988-24833-0013.flac。除了以dev-开头外,我不能保证第二部分有任何内容 我需要使它具有通用性,这样它就可以处理任意的stem,比如train-,等等 def replace_second_part(path, with_what):

我有一个路径看起来像:
data/dev-noise-subtractive-250ms-1/1988/24833/1988-24833-0013.flac

我想做的是替换第二部分,使其成为
data/dev clean/1988/24833/1988-24833-0013.flac
。除了以
dev-
开头外,我不能保证第二部分有任何内容

我需要使它具有通用性,这样它就可以处理任意的stem,比如
train-
,等等

def replace_second_part(path, with_what):
    parts = path.split('/')
    parts[1] = with_what
    return '/'.join(parts)
如果您希望使用
os使其更具可移植性(例如在Windows下工作),则首选path


如果您希望使用
os使其更便于移植(例如,在Windows下工作)。首选path

您可以使用
re
将其匹配并替换为:

def func(pattern, file):
    return re.sub(f'{pattern}[^/]+/', f'{pattern}clean/', file)


func('dev-', 'data/dev-noise-subtractive-250ms-1/1988/24833/1988-24833-0013.flac')
#data/dev-clean/1988/24833/1988-24833-0013.flac
func('train-', 'data/train-noise-subtractive-250ms-1/1988/24833/1988-24833-0013.flac')
#data/train-clean/1988/24833/1988-24833-0013.flac
func('train-', 'data/xxx/xxx/train-noise-subtractive-250ms-1/1988/24833/1988-24833-0013.flac')
#data/xxx/xxx/train-clean/1988/24833/1988-24833-0013.flac

您可以使用
re
将其匹配并替换为:

def func(pattern, file):
    return re.sub(f'{pattern}[^/]+/', f'{pattern}clean/', file)


func('dev-', 'data/dev-noise-subtractive-250ms-1/1988/24833/1988-24833-0013.flac')
#data/dev-clean/1988/24833/1988-24833-0013.flac
func('train-', 'data/train-noise-subtractive-250ms-1/1988/24833/1988-24833-0013.flac')
#data/train-clean/1988/24833/1988-24833-0013.flac
func('train-', 'data/xxx/xxx/train-noise-subtractive-250ms-1/1988/24833/1988-24833-0013.flac')
#data/xxx/xxx/train-clean/1988/24833/1988-24833-0013.flac

但它并不总是
dev-
,我不知道它总是第二部分,你必须有一个确切的模式来做类似的事情,模式或一些总是有效的逻辑,你可以用这个想法来实现。现在,你的想法还不够清晰,你打算如何实施?这是我的问题。我想要一个函数,这样我就可以通过任何stem:
dev-
train-
,等等。它将匹配路径的相关部分,并替换为
*-clean
,它是否总是从stem开始,并且始终是第二个目录
/data/dev随便什么
/data/train something
很明显,它总是从阀杆开始,但不是第二个方向,但它不总是
dev-
,我不知道它总是第二个部分。你必须有精确的模式来做类似的事情,模式或一些总是有效的逻辑,你可以通过这个想法来实现。现在,你的想法还不够清晰,你打算如何实施?这是我的问题。我想要一个函数,这样我就可以通过任何stem:
dev-
train-
,等等。它将匹配路径的相关部分,并替换为
*-clean
,它是否总是从stem开始,并且始终是第二个目录
/data/dev which
/data/train something很明显,它总是以stem开头,但不是第二个目录