Python expression régulière pour rechercher une chaîne de caractères comme un modèle et le numéro de retour

J'ai des lignes qui représentent des données dans un fichier texte. Ils sont tous de la forme suivante:

s = 'TheBears      SUCCESS Number of wins : 14'

Ils commencent tous par le nom de domaine, l'espace et le texte de la RÉUSSITE Nombre de victoires : "et enfin le nombre de victoires, n1. Il y a de multiples cordes avec un autre nom et une valeur. Je suis en train d'écrire un programme capable d'analyser un de ces chaînes et de retourner le nom du jeu de données et la valeur numérique à la fin de la chaîne. Je suis en train d'utiliser des expressions régulières pour faire cela et je suis venu avec les éléments suivants:

import re
def winnumbers(s):
    pattern = re.compile(r"""(?P<name>.*?)     #starting name
                             \s*SUCCESS        #whitespace and success
                             \s*Number\s*of\s*wins  #whitespace and strings
                             \s*\:\s*(?P<n1>.*?)""",re.VERBOSE)
    match = pattern.match(s)

    name = match.group("name")
    n1 = match.group("n1")

    return (name, n1)

Jusqu'à présent, mon programme peut renvoyer le nom, mais la difficulté vient après. Ils ont tous le texte de la "RÉUSSITE Nombre de victoires :" alors, ma pensée était de trouver un moyen de correspondre à ce texte. Mais je me rends compte que ma méthode d'appariement exact de sous-chaîne n'est pas correcte. Est-il possible de faire correspondre un ensemble de sous-chaîne dans le cadre du modèle? J'ai lu un peu sur les expressions régulières ces derniers temps mais n'ai rien trouvé de ce genre. Je suis encore vraiment nouveau dans la programmation et j'apprécie toute l'assistance.

Finalement, je vais utiliser float() pour retourner n1 comme un nombre, mais j'ai quitté parce qu'il n'est pas correctement pour trouver le nombre dans la première place dès maintenant et ne renvoie une erreur.

Votre problème est l'utilisation de la .*? à la fin de la regex. Le ? rendre paresseux, ce qui signifie qu'il sera identifié comme de peu de caractères que possible, donc si vous mettez fin à une regex avec .*? il ne correspond à aucun des personnages. Soit se débarrasser de la ? pour votre n1 groupe ou ajouter un $ à la fin de la regex de sorte qu'il sera forcé de match à la fin de la ligne.
Retrait de l' ? à la fin de la n1 groupe a fait le tour! Je vous remercie beaucoup. Je vais garder cela à l'esprit et être plus prudent qu'à partir de maintenant.

OriginalL'auteur Simos Anderson | 2011-06-16