在
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',
'']
这段代码可以实现你想要的功能,但是它会将文件名和扩展名分开并在最后留下一个空格,这不是你想要的(除非你想进行丑陋的后处理)。此外,这是一个重复的问题:如何在Python中拆分字符串并保留分隔符?
但是,你需要使用re.findall
而不是re.split
:
>>> 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
,反之亦然。
re.split('(.txt|.mpd|.mp4)', file_str)
这样的东西吗?你的输入和期望输出是什么? - Jean-François Fabre