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.pathmuatntpathmodul secara internal. Dengan menggunakan modul ini, dimungkinkan untuk menangani'\\'separator path bahkan pada mesin Linux. Untuk Linuxposixpathmodul (resp.os.path) Akan menyederhanakan operasi jalur untuk memungkinkan hanya'/'pemisah gaya posix.