Inilah solusi khusus regex, yang tampaknya berfungsi dengan jalur OS apa pun pada OS apa pun.
Tidak diperlukan modul lain, dan tidak perlu preprocessing:
import re
def extract_basename(path):
"""Extracts basename of a given path. Should Work with any OS Path on any OS"""
basename = re.search(r'[^\\/]+(?=[\\/]?$)', path)
if basename:
return basename.group(0)
paths = ['a/b/c/', 'a/b/c', '\\a\\b\\c', '\\a\\b\\c\\', 'a\\b\\c',
'a/b/../../a/b/c/', 'a/b/../../a/b/c']
print([extract_basename(path) for path in paths])
# ['c', 'c', 'c', 'c', 'c', 'c', 'c']
extra_paths = ['C:\\', 'alone', '/a/space in filename', 'C:\\multi\nline']
print([extract_basename(path) for path in extra_paths])
# ['C:', 'alone', 'space in filename', 'multi\nline']
Memperbarui:
Jika Anda hanya ingin potensial nama file, jika ada (yaitu, /a/b/
adalah dir dan begitu juga c:\windows\
), mengubah regex untuk: r'[^\\/]+(?![\\/])$'
. Untuk "regex challengeed," ini mengubah lookahead maju positif untuk semacam garis miring menjadi lookahead maju negatif, menyebabkan nama path yang berakhir dengan slash tersebut tidak menghasilkan apa-apa alih-alih sub-direktori terakhir dalam pathname. Tentu saja tidak ada jaminan bahwa nama file potensial sebenarnya mengacu pada file dan untuk itu os.path.is_dir()
atau os.path.is_file()
perlu dipekerjakan.
Ini akan cocok sebagai berikut:
/a/b/c/ # nothing, pathname ends with the dir 'c'
c:\windows\ # nothing, pathname ends with the dir 'windows'
c:hello.txt # matches potential filename 'hello.txt'
~it_s_me/.bashrc # matches potential filename '.bashrc'
c:\windows\system32 # matches potential filename 'system32', except
# that is obviously a dir. os.path.is_dir()
# should be used to tell us for sure
Regex dapat diuji di sini .
os.path
muatntpath
modul secara internal. Dengan menggunakan modul ini, dimungkinkan untuk menangani'\\'
separator path bahkan pada mesin Linux. Untuk Linuxposixpath
modul (resp.os.path
) Akan menyederhanakan operasi jalur untuk memungkinkan hanya'/'
pemisah gaya posix.r'C:\path\to\file.txt'
) pada mesin Linux, Anda perlu menggunakan modul ntpath. Jika tidak, Anda dapat menggunakan fungsi dari os.path. Ini karena sistem Linux biasanya memungkinkan penggunaan karakter backslash dalam nama file (seperti yang dijelaskan dalam jawaban).os.path.basename(os.path.normpath(path))
?