2010-10-22 30 views
11

Estoy intentando comprobar si una cadena es un número, por lo que la expresión regular "\ d +" parecía buena. Sin embargo, que también se ajusta a la expresión regular "78.46.92.168:8000" por alguna razón, que no quiero, un poco de código:Comprobación de una cadena completa con una expresión regular

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

Y hacerTarea() se llama cuando se introduce la dirección IP. Estoy un poco confundido, ¿cómo "". o ":" coincide con "\ d"?

Respuesta

22

\d+ coincide con cualquier número positivo de dígitos dentro la cadena, lo que coincide con el primer 78 y tiene éxito.

Utilice ^\d+$.

O, aún mejor: "78.46.92.168:8000".isdigit()

+1

+1. Evita las expresiones regulares si puedes. –

+1

'\ d + $' debería ser suficiente con la coincidencia – Medorator

+0

'$' no funciona en el caso de una nueva línea final. Ver 're.match (r '^ \ d + $', '4 \ n')' por ejemplo. – Antimony

10

re.match() partidos siempre desde el inicio de la cadena (a diferencia de re.search()), pero permite el partido para terminar antes del final de la cadena.

Por lo tanto, necesita un ancla: _rex.match(r"\d+$") funcionaría.

Para ser más explícito, también puede usar _rex.match(r"^\d+$") (que es redundante) o simplemente colocar re.match() en total y simplemente use _rex.search(r"^\d+$").

7

\Z coincide con el final de la cadena, mientras que $ coincide con el final de la cadena, o justo antes del salto de línea al final de la cadena, y presenta un comportamiento diferente en re.MULTILINE. Consulte the syntax documentation para obtener información detallada.

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

Hay un par de opciones en Python para hacer coincidir una entrada completa con una expresión regular.

Python 2

En Python 2.x, puede utilizar

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

o - para evitar el juego antes de la final en la cadena de \n:

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

o igual arriba con el método re.search que requiere el uso de ^/\A ancla de inicio de cadena ya que no ancla el matc h en el comienzo de la cadena:

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

Tenga en cuenta que \A es un ancla inicio cadena inequívoca, su comportamiento no puede ser redefinido con cualquier modificador (re.M/re.MULTILINE sólo puede redefinir el comportamiento ^ y $).

Python 3

Todos los casos descritos en la sección Python 2 y un método más útil, re.fullmatch (también presente en el PyPi regex module):

Si todo el cadena coincide con la expresión regular patrón, devuelva un objeto de coincidencia correspondiente. Devuelve None si la cadena no coincide con el patrón; tenga en cuenta que esto es diferente de una coincidencia de longitud cero.

Así que, después de compilar la expresión regular, sólo tiene que utilizar el método apropiado:

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