Expresiones regulares: Cómo “paso atrás”
-
11-10-2019 - |
Pregunta
Estoy teniendo algunos problemas para cocinar una expresión regular que produce este resultado:
Mike 1 , misha 1,2 , Miguel 1,2,3,4,5,6,7,18 y michea 2,3
¿Cómo retroceder un paso en expresiones regulares y deseche el último partido? Eso es lo que necesito una coma antes de un espacio para no coinciden. Esto lo que me ocurrió ...
\d+(,|\r)
Mike 1, misha 1,2, Miguel 1,2,3,4,5,6,7,18, y Micheal 2,3
Solución
La característica de expresiones regulares que estés preguntando por se llama positivo de búsqueda hacia atrás . Pero en su caso, no creo que lo necesite. Prueba esto:
\d+(?:,\d+)*
En el ejemplo, esto va a coincidir con las listas de números delimitados por comas y no incluyen los nombres y las comas finales y espacios en blanco.
Aquí es un poco corta de código de prueba escrita en PHP que lo verifica en su entrada:
<?php
$input = "Mike1, misha1,2, miguel1,2,3,4,5,6,7,18, and Micheal2,3";
$matches = array();
preg_match_all('/\d+(?:,\d+)*/', $input, $matches);
print_r($matches[0]);
?>
salidas:
Array
(
[0] => 1
[1] => 1,2
[2] => 1,2,3,4,5,6,7,18
[3] => 2,3
)
Otros consejos
Creo \d+,(?!\s)
va a hacer lo que quiere. El ?!
es un href="http://www.regular-expressions.info/lookaround.html" rel="nofollow"> ?! hace no aparecen en esta posición en la cadena de búsqueda.
>>> re.findall(r'\d+,(?!\s)', 'Mike1, misha1,2, miguel1,2,3,4,5,6,7,18, and Michea2,3')
['1,', '1,', '2,', '3,', '4,', '5,', '6,', '7,', '2,']
O si desea hacer coincidir la lista separada por comas de los números excluyendo la final \d+(?:,\d+)*
uso de la coma.
>>> re.findall(r'\d+(?:,\d+)*', 'Mike1, misha1,2, miguel1,2,3,4,5,6,7,18, and Michea2,3')
['1', '1,2', '1,2,3,4,5,6,7,18', '2,3']