2015-10-10 1 views
0

J'ai une liste de chaînes comme ceci:Comment améliorer cette regex?

/soccer/poland/ekstraklasa-2008-2009/results/ 
/soccer/poland/orange-ekstraklasa-2007-2008/results/ 
/soccer/poland/orange-ekstraklasa-youth-2010-2011/results/ 

De chaque chaîne que je veux prendre une partie centrale entraînant respectivement:

ekstraklasa 
orange ekstraklasa 
orange ekstraklasa youth 

Mon code fait ici le travail, mais il se sent comme ça peut être fait en moins d'étapes et probablement avec regex seul.

name = re.search('/([-a-z\d]+)/results/', string).group(1) # take the middle part 
name = re.search('[-a-z]+', name).group()     # trim numbers 
if name.endswith('-'): 
    name = name[:-1]          # trim tailing `-` if needed 
name = name.replace('-', ' ') 

Quelqu'un peut-il voir comment le rendre meilleur?

Répondre

1

Ce regex devrait faire le travail:

/(?:\/\w+){2}\/([\w\-]+)(?:-\d+){2}/ 

Explication:

  • (?:\/\w+){2} - manger les deux premiers mots séparés par /
  • \/ - manger la prochaine /
  • ([\w\-]+) - correspondre aux caractères des traits d'union (c'est ce que nous recherchons ng pour)
  • (?:-\d+){2} - manger les traits d'union et les chiffres après la partie que nous recherchons

Le résultat est dans le premier groupe de correspondance

+0

Merci pour un essai. Cependant, je l'ai testé sur regex101.com et n'a trouvé aucun match du tout. –

+0

@rojas Vous devez donc l'avoir copié incorrectement: https://regex101.com/r/mK0iO9/1 – davidrac

1

Je ne peux pas le tester parce que je ne suis pas en Python , mais je voudrais utiliser une expression comme

^(/soccer/poland/)([a-z\-]*)(.*)$ 

ou

^(/[a-z]*/[a-z]*/)([a-z\-]*)(.*)$ 

Cet Expressen fonctionne comme "/ soccer/pologne /" au début, que "tout avec a à z (petit) ou -" et le reste de la chaîne.

Et que de prendre 2e groupe!

Les groupes devraient tenir cette Strings:

    1. /football/pologne/
    1. orange Ekstraklasa-JEUNES
    1. 2010-2011/Résultats/

Et puis en remplaçant simplement "-" avec "" et après que les espaces TRIM.

PS: Si vous utilisez regex101.com par ex., vous devez échapper/ET juste utiliser une ligne de chaîne! Expression

^(\/soccer\/poland\/)([a-z\-]*)(.*)$ 

Et une ligne de ur chaîne.

/football/pologne/orange-Ekstraklasa-jeunes 2010-2011/Résultats/

Si u préfére utiliser l'expression non seulement pour le football et la pologne, utilisez

^(\/[a-z]*\/[a-z]*\/)([a-z\-]*)(.*)$ 
+0

L'avez-vous testé? J'ai effectué un test sur regex101.com et, malheureusement, il n'a trouvé aucun résultat. De plus, le premier regex est trop strict, il y aura d'autres noms que soccer/pologne. –