El número de expresiones telefónicas de Python no funciona lo suficientemente bien

Tengo este código regex que utilizo en mi código:

pattern = re.compile('\d{3,4}(\/?)(\d{6,6})') m= pattern.match('0481/987421') if m: print "yes" else: print "no" 

Es una expresión regular que debería funcionar para números de teléfono como este: dddd / dddddddd, por lo tanto, primero 3 o 4 dígitos, luego una barra o no y luego exactamente 6 dígitos. Funciona bien, por ejemplo, 21/484135 no funciona y otras cosas incorrectas tampoco funcionan. Pero el problema de esta expresión regular es que, cuando mis primeros caracteres tienen razón y escribo algo al azar detrás de ella, todavía se imprimiría “sí”. Me refiero a algo como esto: 0481/9874214879516874 Creo que debido a que las expresiones regulares coinciden con los primeros 11 caracteres con los que regresan y no importa lo que venga detrás.

¿Como puedó resolver esté problema?

Necesitas anclar tu expresión. Agregue un $ o \Z al final para asegurarse de que nada siga. También puede agregar ^ para anclarlo al principio de la cadena, aunque no es necesario cuando se usa con match() .

 pattern = re.compile(r"^\d{3,4}/?\d{6}\Z") 

Sugeriría usar el módulo de números telefónicos en lugar de escribir su propia expresión regular. Aquí hay un ejemplo de analizar un número de teléfono belga:

 >>> x = phonenumbers.parse("0481/987421", "BE") >>> x PhoneNumber(country_code=32, national_number=481987421L, extension=None, italian_leading_zero=False, country_code_source=None, preferred_domestic_carrier_code=None) 

Lanzará una excepción en números de teléfono inválidos:

 >>> x = phonenumbers.parse("0481/9874214879516874", "BE") Traceback (most recent call last): File "", line 1, in  File "/usr/local/lib/python2.7/dist-packages/phonenumbers/phonenumberutil.py", line 2038, in parse "The string supplied is too long to be a phone number.") phonenumbers.phonenumberutil.NumberParseException: (4) The string supplied is too long to be a phone number.