2010-10-22 5 views
11

J'essaie de vérifier si une chaîne est un nombre, donc l'expression rationnelle "\ d +" semble bonne. Cependant que regex convient également « 78.46.92.168:8000 » pour une raison quelconque, que je ne veux pas, un peu de code: est appelé lorsque l'adresse IP est entréVérification de la chaîne entière avec une regex

class Foo(): 
    _rex = re.compile("\d+") 
    def bar(self, string): 
     m = _rex.match(string) 
     if m != None: 
      doStuff() 

Et doStuff(). Je suis un peu confus, comment ça "." ou ":" correspond à "\ d"?

Répondre

22

\d+ correspond à un nombre positif de chiffres dans votre chaîne, il correspond à la première 78 et réussit.

Utilisez ^\d+$.

Ou, mieux encore: "78.46.92.168:8000".isdigit()

+1

+1. Évitez les expressions rationnelles si vous le pouvez. –

+1

'\ d + $' devrait être suffisant avec la correspondance – Medorator

+0

'$' ne fonctionne pas dans le cas d'une nouvelle ligne de fin. Voir 're.match (r '^ \ d + $', '4 \ n')' par exemple. – Antimony

10

re.match() correspond toujours depuis le début de la chaîne (contrairement re.search()), mais permet le match se terminer avant la fin de la chaîne.

Par conséquent, vous avez besoin d'une ancre: _rex.match(r"\d+$") fonctionnerait. Pour être plus explicite, vous pouvez également utiliser _rex.match(r"^\d+$") (qui est redondant) ou simplement supprimer re.match() et utiliser simplement _rex.search(r"^\d+$").

7

\Z correspond à la fin de la chaîne tandis que $ correspond à la fin de la chaîne ou juste avant le retour à la fin de la chaîne, et présente un comportement différent dans re.MULTILINE. Voir the syntax documentation pour des informations détaillées.

>>> s="1234\n" 
>>> re.search("^\d+\Z",s) 
>>> s="1234" 
>>> re.search("^\d+\Z",s) 
<_sre.SRE_Match object at 0xb762ed40> 
2

Il existe plusieurs options en Python pour faire correspondre une entrée entière avec une regex.

Python 2

En Python 2.x, vous pouvez utiliser

re.match(r'\d+$') # re.match anchors the match at the start of the string, so $ is what remains to add 

ou - pour éviter la mise en correspondance avant \n finale dans la chaîne:

re.match(r'\d+\Z') # \Z will only match at the very end of the string 

Ou le même que ci-dessus avec re.search méthode nécessitant l'utilisation de ^/\A ancre de début de chaîne car elle n'ancre pas le matc h au début de la chaîne:

re.search(r'^\d+$') 
re.search(r'\A\d+\Z') 

Notez que \A est un point d'ancrage de début de chaîne sans ambiguïté, son comportement ne peut être redéfinie avec des modificateurs (re.M/re.MULTILINE ne peut redéfinir le comportement ^ et $).

Python 3

Tous les cas décrits dans la section Python 2 et une autre méthode utile, re.fullmatch (également présent dans le PyPi regex module):

Si toute la chaîne correspond à l'expression régulière modèle, retourne un objet correspondant. Renvoie None si la chaîne ne correspond pas au modèle; Notez que cela est différent d'une correspondance de longueur nulle.

Ainsi, après vous compilez le regex, il suffit d'utiliser la méthode appropriée:

_rex = re.compile("\d+") 
if _rex.fullmatch(s): 
    doStuff() 
Questions connexes