Voy a hacer coincidir dos casos: 123456-78-9 o 123456789. Mi objetivo es recuperar 123456789 de cualquier caso, es decir, excluir el '-' del primer caso, no es necesario mencionar que el segundo caso es bastante sencillo .

Intenté usar una expresión regular como r"\b(\d+(?:-)?\d+(?:-)?\d)\b", pero aún me devuelve '123456-78-9'.

¿Cuál es la expresión regular correcta que debo usar? Aunque sé hacerlo en dos pasos: 1) obtener tres partes de dígitos mediante expresiones regulares 2) usar otra línea para concatenarlos, pero aún prefiero una expresión regular para que el código sea más elegante.

Gracias por cualquier consejo!

1
Cuteufo 28 sep. 2019 a las 18:12

3 respuestas

La mejor respuesta

Puede colocar las partes numéricas en los grupos de captura y luego reemplazar toda la coincidencia con solo los grupos capturados.

Intenta algo como:

\b(\d+)-?(\d+)-?(\d)\b

..y reemplazar con:

\1\2\3

Tenga en cuenta que los dos grupos sin captura que está utilizando son redundantes. (?:-)? = -?.

demostración de expresiones regulares.

Ejemplo de Python:

import re

regex = r"\b(\d+)-?(\d+)-?(\d)\b"

test_str = ("123456-78-9\n"
            "123456789")
subst = "\\1\\2\\3"

result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

Salida:

123456789
123456789

Pruébelo en línea.

0
Ahmed Abdelhameed 28 sep. 2019 a las 16:34

Puedes usar r'(\d{6})(-?)(\d{2})\2(\d)'
Luego, únase a los grupos 1, 3 y 4, o reemplace usando "\\1\\3\\4"

Solo coincidirá con estas dos entradas:

123456-78-9 o 123456789

Depende de usted ponerle condiciones de contorno si es necesario.

https://regex101.com/r/ceB10E/1

2
x15 28 sep. 2019 a las 18:06

Lo más fácil de hacer aquí sería usar primero re.sub para eliminar todos los caracteres que no sean dígitos de la entrada. Luego, use una comparación de igualdad para verificar la entrada:

inp = "123456-78-9"
if re.sub(r'\D', '', inp) == '123456789':
    print("MATCH")

Editar: si entendí mal su problema, y en su lugar las entradas podrían ser cualquier cosa, y solo desea hacer coincidir los dos formatos dados, use una alternancia:

\b(?:\d{6}-\d{2}-\d|\d{9})\b

Guión:

inp = "123456-78-9"
if re.search(r'\b(?:\d{6}-\d{2}-\d|\d{9})\b', inp):
    print("MATCH")
0
Tim Biegeleisen 28 sep. 2019 a las 15:31
58147635