Voici une solution uniquement regex, qui semble fonctionner avec n'importe quel chemin de système d'exploitation sur n'importe quel système d'exploitation.
Aucun autre module n'est nécessaire, et aucun prétraitement n'est nécessaire non plus:
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']
Mise à jour:
Si vous voulez seulement un potentiel nom de fichier, le cas échéant (c. -à- /a/b/
est un répertoire et est donc c:\windows\
), changer l'expression rationnelle à: r'[^\\/]+(?![\\/])$'
. Pour le «regex contesté», cela change le lookahead avant positif pour une sorte de barre oblique en un lookahead avant négatif, ce qui fait que les chemins d'accès qui se terminent par cette barre oblique ne retournent rien au lieu du dernier sous-répertoire du chemin d'accès. Bien sûr, il n'y a aucune garantie que le nom de fichier potentiel se réfère réellement à un fichier et pour cela os.path.is_dir()
ou os.path.is_file()
devrait être utilisé.
Cela correspondra comme suit:
/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
Le regex peut être testé ici .
os.path
charge simplement lentpath
module en interne. En utilisant ce module, il est possible de gérer les'\\'
séparateurs de chemin même sur les machines Linux. Pour Linux, leposixpath
module (resp.os.path
) Simplifiera les opérations de chemin pour n'autoriser que les'/'
séparateurs de style posix .