Python regex extraire des répertoires du chemin d'accès
J'ai une question à propos de regex/Python. Désolé si ce sujet a été discuté des millions de fois, d'habitude je trouve les réponses sur so/google etc. mais je suis coincé dans les millions de réponses avec celui-ci.. (Pour être honnête, je suis propriétaire d'une regex livre, mais de toute façon je suis trop stupide pour comprendre vraiment...)
Pour une musique de système de gestion j'ai besoin d'extraire des informations de chemins d'accès, mise à disposition de différents ensembles d'options. Voici deux exemples:
Si le chemin d'accès est: (Cas 1)
"/The Prodigy/The Fat Of The Land/04 - Funky Stuff.flac"
il doit extraire:
- artiste: "Le Prodige"
- de presse: "La Graisse De La Terre"
- Tracknumber: 4
- Titre: "Funky Stuff"
Et pour exemple: (Cas 2)
"/[XLR 483] The Fat Of The Land/04 - The Prodigy - The Funky Stuff.flac"
extraire:
- catno: "XLR 483"
- de presse: "La Graisse De La Terre"
- Tracknumber: 4
- artiste: "Le Prodige"
- Titre: "Funky Stuff"
Il n'est pas nécessaire pour une regex qui couvre les deux cas, ce sont juste deux exemples. Je vais leur donner que des options (ou de point de départ pour ajouter propre).
Toute aide serait grandement appréciée!
@ S. Lott: je n'ai pas de regex pour cela, j'ai commencé avec le fractionnement de la chaîne:
parts = rel_path.split('/')
track = parts[-1]
release = parts[-2]
artist = parts[-3]
mais cela ressemble à un extrêmement rigides et peu élégante solution pour moi.
edit:
Pour l'instant j'ai quelque chose comme:
pattern = re.compile('^/(?P<artist>[a-zA-Z0-9 ]+)/(?P<release>[a-zA-Z0-9 ]+)/(?P<track>[a-zA-Z0-9 -_]+).[a-zA-Z]*.*')
rel_path = '/The Prodigy/The Fat Of The Land/04 - Funky Stuff.flac'
match = pattern.search(rel_path)
artist = match.group('artist')
release = match.group('release')
track = match.group('track')
Quel est le problème avec le fractionnement de la chaîne? Il fonctionne, non?
S. Lott - il rien de mal à se fendre, mais il est difficile d'avoir le modèle modifiable (le code à l'extérieur). J'aimerais fournir (modifiable) des presets dans une interface d'administration.
a-zA-Z
?? Pourquoi n'êtes-vous pas utiliser l'Unicode?Comme indiqué ci-dessus - peut-être parce que je ne suis pas assez intelligent pour le comprendre... 🙂
OriginalL'auteur ohrstrom | 2012-02-13
Vous devez vous connecter pour publier un commentaire.
Bien que pas nécessaire, mais re est pratique choix pour ce problème.
Je utiliser des expressions telles que
[a-zA-Z0-9 ]
de spécifier explicitement les caractères-je attendre de la chaîne. C'est juste ma préférence pour avoir une liste blanche-comme regex pour rendre le code plus sûr. Il existe de nombreuses autres façons de composer équivalent des modèles. Vous trouverez tout ce que vous devez ici http://docs.python.org/library/re.html, vous n'avez pas besoin d'un livre pour cela.Ok comprendre après le montage 🙂
OriginalL'auteur Will Cheng
(où
file1
etfile2
sont les chemins que vous avez donné ci-dessus).Première chose: vous capturer quelque chose compensée par une regex avec des parenthèses. Donc tout ce qui est entre parenthèses ci-dessous seront cracher en ressortir un élément dans le match.
Deuxième: vous correspondent tout sauf une barre oblique avec la regex code comme
[^/]
. Donc, pour correspondre à beaucoup de choses, entre barres obliques, vous ne[^/]*
.Mettre ensemble, pour capturer l'artiste dans votre premier sttring, vous ne
/([^/]*)/
. Ensuite, vous n'avez qu'à nouveau pour obtenir la libération.Troisième: correspond à tous les chiffres, vous utilisez
[0-9]
. Donc, pour correspondre à n'importe quelle chaîne de chiffres, vous utilisez[0-9]*
.Appliquer ces principes à plusieurs reprises, et vous devriez être en mesure de comprendre ce qui précède.
Yep.
groups()
retourne un tuple, et c'est d'une manière générale d'attribuer des noms à différentes parties d'un tuple.OriginalL'auteur Mike
Voici mon approche du problème que vous rencontrez.
Si vous avez des doutes, dans l'écriture de regex, de modifier une question et de suivre S. Lott de la suggestion.
OriginalL'auteur Senthil Kumaran
Vous devriez poing utilisation
split
avec le/
délimiteur de sorte que vous serez en mesure d'avoir des informations juste avec la taille du tableau retourné parsplit
.Ensuite, vous pouvez utiliser regexp si vous avez besoin d'. Par exemple, dans le deuxième cas: (qui ne se produit que si vous avez deux éléments de droit?)
Il peut semble un peu compliqué, mais j'ai échappé à tous des personnages ambigus donc, fondamentalement, le modèle est le suivant:
^
au début/?
il peut y avoir au plus une barre oblique/
suivie par...[
une accolade([^\]]+)
contenant tous mais une accolade de fermeture en une ou plusieurs fois+
(et s'il vous plaît, capturer les valeurs, en utilisant le groupement de la parenthèse) et]
une accolade de fermeture suivie par(.*)
rien, mais un saut de ligne (0 fois ou plus*
) capturées via la parenthèse/
.espérons que cette aide!
OriginalL'auteur Aif