Python regex pour int avec au moins 4 chiffres
Je suis juste l'apprentissage de la regex et je suis un peu perdu ici. J'ai une chaîne à partir de laquelle je veux extraire un int avec au moins 4 chiffres et à plus de 7 chiffres. Je l'ai essayé comme suit:
>>> import re
>>> teststring = 'abcd123efg123456'
>>> re.match(r"[0-9]{4,7}$", teststring)
Où je m'attendais à 123456, malheureusement, cela aboutit à rien du tout. Quelqu'un pourrait-il m'aider un peu ici?
Ne seriez-vous pas attendre
Ah, oui. Vous êtes de droite. Excusez-moi. J'ai corrigé.
123456
?Ah, oui. Vous êtes de droite. Excusez-moi. J'ai corrigé.
OriginalL'auteur kramer65 | 2013-05-02
Vous devez vous connecter pour publier un commentaire.
@ExplosionPills est correct, mais il y aurait encore deux problèmes avec votre regex.
D'abord,
$
correspond à la fin de la chaîne. Je devine que vous souhaitez être en mesure d'extraire un int dans le milieu de la chaîne ainsi, par exempleabcd123456efg789
de retour123456
. Pour corriger cela, vous voulez que cela:L'ajout d'une portion d'un anticipation négatif affirmation, sens, "...n'est pas suivie par tous les autres numéros." Laissez-moi simplifier que par l'utilisation de
\d
:C'est mieux. Maintenant, le deuxième problème. Vous n'avez pas de contrainte sur le côté gauche de votre regex, donc, étant donné une chaîne de caractères comme
abcd123efg123456789
, vous fait match3456789
. Donc, vous avez besoin d'un négatif lookbehind affirmation ainsi:Facile.
r"(?<!\d)(?:19[5-9]\d|20[0-4]\d|2050)(?!\d)"
. Avoir du plaisir 🙂Je suppose que, dans le cas où vous n'êtes pas familier avec ces constructions, je dois expliquer certaines choses. Ignorer la
(?: ... )
; juste faire semblant que c'est un groupe de( ... )
. Et le|
sont alternance opérateurs, comme, "ceci ou Ceci OU cela."Merci pour cette! L' | constructions je sais à partir de php, mais ce que je me demande est en fait la ?: et le < au début..?
Le
(?: ... )
simplement le fait d'un groupe dans un non-capture groupe. Vous savez comment( ... )
normalement capture ce qui est entre dans des variables comme$1
,$2
, etc.? Le?:
simplement l'en empêche. C'est une bonne pratique pour être explicite lorsque vous n'êtes pas en train d'utilisation de la capture. Le<
au début est juste la syntaxe d'un négatif lookbehind affirmation:(?<! ... )
; la<
est censé ressembler à une flèche pointant derrière.OriginalL'auteur Andrew Cheong
.match
ne correspondent si la chaîne commence avec le modèle. Utilisation.search
.OriginalL'auteur Explosion Pills
Vous pouvez également utiliser:
Qui renvoie une liste de toutes les sous-chaînes qui correspondent à vos regex, dans votre cas ['123456']
Si vous êtes simplement intéressé par la première sous-chaîne correspondante, alors vous pouvez écrire ce que:
oups! bonne prise, @dansalmo
OriginalL'auteur galarant