Oto rozwiązanie tylko do wyrażenia regularnego, które wydaje się działać z każdą ścieżką systemu operacyjnego w dowolnym systemie operacyjnym.
Nie jest potrzebny żaden inny moduł ani wstępne przetwarzanie:
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']
Aktualizacja:
Jeśli chcesz tylko potencjalną nazwę pliku, jeśli jest obecny (czyli /a/b/
to dir i tak jest c:\windows\
), zmienić regex: r'[^\\/]+(?![\\/])$'
. W przypadku „wyrażenia regularnego zakwestionowanego” zmienia to pozytywne spojrzenie w przód dla jakiegoś ukośnika na negatywne spojrzenie w przód, powodując, że ścieżki, które kończą się tym ukośnikiem, nie zwracają niczego zamiast ostatniego podkatalogu w nazwie ścieżki. Oczywiście nie ma gwarancji, że potencjalna nazwa pliku faktycznie odnosi się do pliku i do tego os.path.is_dir()
lub os.path.is_file()
będzie musiał zostać zastosowany.
Będzie to pasować w następujący sposób:
/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
Wyrażenie regularne można przetestować tutaj .
os.path
po prostu ładujentpath
moduł wewnętrznie. Za pomocą tego modułu można obsługiwać'\\'
separatory ścieżek nawet na maszynach z systemem Linux. W Linuksieposixpath
moduł (odpowiednioos.path
) uprości operacje na ścieżce, pozwalając tylko na'/'
separatory w stylu posix .