如何在Python中使用多个分隔符分割字符串而不删除分隔符?

Ale*_*dez 3 python

我目前在 txt 文件中有一个文件名列表,我正在尝试对它们进行排序。我想做的第一个是将它们分成一个列表,因为它们都在一行中。列表中有 3 种文件类型。我可以拆分列表,但我想在最终结果中保留分隔符,但我无法找到一种方法来做到这一点。我分割文件的方式如下:

import re

def breakLines():
    unsorted_list = []
    file_obj = open("index.txt", "rt")
    file_str = file_obj.read()

    unsorted_list.append(re.split('.txt|.mpd|.mp4', file_str))

    print(unsorted_list)

breakLines()
Run Code Online (Sandbox Code Playgroud)

我发现 DeepSpace 的答案在这里非常有用Split a string with "(" and ")" and keep the delimiters (Python),但这似乎只适用于单个字符。

编辑:

输入示例:

文件名1234.mp4文件名1235.mp4文件名1236.mp4文件名1237.mp4

预期输出:

文件名1234.mp4

文件名1235.mp4

文件名1236.mp4

文件名1237.mp4

Jea*_*bre 6

在 中re.split,关键是将分割模式加上括号,以便将其保留在 的结果中re.split。你的尝试是:

>>> s = "file_name1234.mp4file_name1235.mp4file_name1236.mp4file_name1237.mp4"
>>> re.split('.txt|.mpd|.mp4', s)
['file_name1234', 'file_name1235', 'file_name1236', 'file_name1237', '']
Run Code Online (Sandbox Code Playgroud)

好吧,这不起作用(并且这些点需要转义才能真正符合扩展名),所以让我们尝试一下:

>>> re.split('(\.txt|\.mpd|\.mp4)', s)
['file_name1234',
'.mp4',
 'file_name1235',
 '.mp4',
 'file_name1236',
 '.mp4',
 'file_name1237',
 '.mp4',
 '']
Run Code Online (Sandbox Code Playgroud)

有效,但这会将扩展名与文件名分开,并在最后留下空白,这不是您想要的(除非您想要丑陋的后处理)。另外,这是一个重复的问题:在Python中,如何分割字符串并保留分隔符?

但你不想要re.split你想要的re.findall:

>>> s = "file_name1234.mp4file_name1235.mp4file_name1236.mp4file_name1237.mp4"
>>> re.findall('(\w*?(?:\.txt|\.mpd|\.mp4))',s)
['file_name1234.mp4',
 'file_name1235.mp4',
 'file_name1236.mp4',
 'file_name1237.mp4']
Run Code Online (Sandbox Code Playgroud)

表达式匹配单词字符(基本上是数字、字母和下划线),后跟扩展名。为了能够创建 OR,我在主组内创建了一个非捕获组。

如果您有更多奇特的文件名,您将无法再使用\w,但它仍然可以合理地工作(您可能需要一些str.strip后处理来删除可能不属于文件名的前导/尾随空白):

>>> s = " file name1234.mp4file-name1235.mp4 file_name1236.mp4file_name1237.mp4"
>>> re.findall('(.*?(?:\.txt|\.mpd|\.mp4))',s)
[' file name1234.mp4',
 'file-name1235.mp4',
 ' file_name1236.mp4',
 'file_name1237.mp4']
Run Code Online (Sandbox Code Playgroud)

所以有时候你re.split需要的时候才想re.findall,反之亦然。