Python 在整个列表中查找字符串的公共部分并将其从每个项目中删除

Rul*_*rld 2 python list python-3.x

我有一个与此类似的文件目录列表:

path/new/stuff/files/morefiles/A/file2.txt
path/new/stuff/files/morefiles/B/file7.txt
path/new/stuff/files/morefiles/A/file1.txt
path/new/stuff/files/morefiles/C/file5.txt
Run Code Online (Sandbox Code Playgroud)

我正在尝试删除相同路径的开头从每个列表中删除,然后从每个文件中删除它。

列表可以是任意长度,在示例中,我将尝试将列表更改为:

A/file2.txt
B/file7.txt
A/file1.txt
C/file5.txt
Run Code Online (Sandbox Code Playgroud)

re.sub(r'.*I', 'I', filepath)和这样的方法filepath.split('_', 1)[-1]可以用于替换,但我不确定如何在文件路径列表中找到公共部分

笔记:

我正在使用 Windows 和 python 3

Rul*_*rld 5

答案的第一部分在这里:Python:从一组(相似的)字符串中确定前缀

使用os.path.commonprefix()查找字符串的最长公共(第一部分)

选择与该答案相同的列表部分的代码是:

# Return the longest prefix of all list elements.
def commonprefix(m):
    "Given a list of pathnames, returns the longest common leading component"
    if not m: return ''
    s1 = min(m)
    s2 = max(m)
    for i, c in enumerate(s1):
        if c != s2[i]:
            return s1[:i]
    return s1
Run Code Online (Sandbox Code Playgroud)

现在您要做的就是使用切片从列表中的每个项目中删除结果字符串

这导致:

# Return the longest prefix of all list elements.
def commonprefix(m):
    "Given a list of pathnames, returns the longest common leading component"
    if not m: return ''
    s1 = min(m)
    s2 = max(m)
    for i, c in enumerate(s1):
        if c != s2[i]:
            ans = s1[:i]
            break
    for each in range(len(m)):
        m[each] = m[each].split(ans, 1)[-1]
    return m
Run Code Online (Sandbox Code Playgroud)