我目前在 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
在 中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,反之亦然。