Trois underscore éléments séparés font mes cordes: - premières (lettres et chiffres) - moyen (lettres, chiffres et tirets) - dernières (lettres et chiffres)Trouver le dernier groupe dans une expression régulière
Les le dernier élément est facultatif.
Note: J'ai besoin d'accéder à mes groupes par leurs noms, pas leurs indices.
Exemples:
String : abc_def
first : abc
middle : def
last : None
String : abc_def_xyz
first : abc
middle: def
last: xyz
String : abc_def_ghi_jkl_xyz
first : abc
middle : def_ghi_jkl
last : xyz
Je ne trouve pas le droit ... regex
J'ai deux idées à ce jour:
groupe en option
(?P<first>[a-z]+)_(?P<middle>\w+)(_(?P<last>[a-z]+))?
Mais les matches de groupe du milieu jusqu'à la fin de la chaîne:
String : abc_def_ghi_jkl_xyz
first : abc
middle : def_ghi_jkl_xyz
last : vide
Utilisation du '|'
(?P<first>[a-z]+)_(?P<middle>\w+)_(?P<last>[a-z]+)|(?P<first>[a-z]+)_(?P<middle>\w+)
Cette expression est invalide: premier et les groupes intermédiaires sont déclarés deux fois. Je croyais que je pourrais écrire une expression réutilisant le groupe apparié de la première partie de l'expression:
(?P<first>[a-z]+)_(?P<middle>\w+)_(?P<last>[a-z]+)|(?P=first)_(?P=middle)
L'expression est valable, mais les chaînes avec juste un premier et un milieu comme abc_def ne correspondent pas.
Remarque
Ces chaînes sont en fait des parties d'un chemin que je dois correspondre. Il pourrait être des chemins comme:
- /chemin/vers/à/abc_def
- /ma/chemin/vers/abc_def/
- /ma/chemin/vers/abc_def/some/autre/Stuf
- /ma/chemin/vers/abc_def/some/autre/Stuf/
- /ma/chemin/vers/abc_def_ghi_jkl_xyz
- /ma/chemin/vers/abc_def_ghi_jkl_xyz/
- /ma/chemin/vers/abc_def_ghi_jkl_xyz/some/other/stuf
- /ma/chemin/vers/abc_def_ghi_jkl_xyz/some/autre/Stuf/
- ...
Toute idée pour résoudre mon problème uniquement avec des expressions régulières? Le post-traitement des groupes appariés n'est pas une option.
Merci beaucoup!
Est-ce que '/ my/path/to /' est constant ou variable? Si variable, comment savez-vous quelle partie du chemin contient la chaîne dont vous essayez d'extraire les sous-chaînes? –