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

时间:2018-09-11 19:44:46

标签: 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()

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

编辑:

样本输入:

  

file_name1234.mp4file_name1235.mp4file_name1236.mp4file_name1237.mp4

预期输出:

  

file_name1234.mp4

     

file_name1235.mp4

     

file_name1236.mp4

     

file_name1237.mp4

1 个答案:

答案 0 :(得分:4)

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', '']

行不通(并且点必须转义以与扩展名真正兼容),所以让我们尝试:

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

可行,但这会将扩展名与文件名分开,并在末尾留空,而不是您想要的(除非您想要丑陋的后处理)。另外,这是一个重复的问题:In Python, how do I split a string and keep the separators?

但是您不希望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']

表达式匹配单词字符(主要是数字,字母和下划线),后跟扩展名。为了能够创建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']

因此有时您在需要re.split时会想到re.findall,反之亦然。