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.
.*?
à 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
Vous devez vous connecter pour publier un commentaire.
Essayez celui-ci:
Ce sont les résultats:
Si vous n'avez pas besoin de toute la chaîne vient de supprimer le surround parenthèse.
OriginalL'auteur fijter
Je crois qu'il n'y a pas besoin d'utiliser une regex ici. Ainsi, vous pouvez utiliser le code suivant s'il acceptable pour vous(notez que j'ai posté il de sorte que vous aurez la capacité d'avoir une autre option):
OU dans le cas où vous êtes sûr que tous les mots sont séparés par des espaces simples:
Ajouté lisible solution))
OriginalL'auteur Artsiom Rudzenka
Si le texte dans le milieu est toujours constante, il n'est pas nécessaire pour une expression régulière. La fonction intégrée de chaîne de fonctions de traitement sera plus efficace et plus facile à développer, déboguer et à entretenir. Dans ce cas, vous pouvez simplement utiliser la fonction intégrée de
split()
fonction pour obtenir les pièces, puis nettoyez-les deux pièces:Remarque que j'ai sortie le nombre de victoires comme un entier (car on peut supposer que ce sera toujours un nombre entier), mais vous pouvez facilement remplacer
float()
- ou toute autre fonction de conversion - pourint()
si vous le désirez.Modifier: Évidemment, cela ne fonctionne que pour une seule ligne - si vous appelez la fonction avec plusieurs lignes, il vous donnera des erreurs. Pour traiter le fichier en entier, je ne l'utiliserais
map()
:Aussi, je ne suis pas sûr de la fin de votre utilisation de ce code, mais vous trouverez peut-être plus facile de travailler avec les sorties comme un dictionnaire:
OriginalL'auteur Blair