python - pattern - re.sub examples
¿Hay un equivalente Perl de re.findall/re.finditer de Python(resultados regex iterativos)? (3)
Para construir sobre la respuesta de Chris, probablemente sea más relevante encapsular la //g
expresión regular en un ciclo while, como:
my @matches;
while ( ''foobarbaz'' =~ m/([aeiou])/g )
{
push @matches, $1;
}
Pegando algunas E / S rápidas de Python:
>>> import re
>>> re.findall(r''([aeiou])([nrs])'',''I had a sandwich for lunch'')
[(''a'', ''n''), (''o'', ''r''), (''u'', ''n'')]
Para obtener algo comparable en Perl, la construcción podría ser algo como:
my $matches = [];
while ( ''I had a sandwich for lunch'' =~ m/([aeiou])([nrs])/g )
{
push @$matches, [$1,$2];
}
Pero, en general, cualquiera que sea la función para la que estés iterando, probablemente puedas hacerlo dentro del ciclo while.
En Python, los patrones regex compilados tienen un método findall
que hace lo siguiente:
Devuelve todas las coincidencias no superpuestas del patrón en cadena, como una lista de cadenas. La cadena se escanea de izquierda a derecha y las coincidencias se devuelven en el orden en que se encuentran. Si uno o más grupos están presentes en el patrón, devuelve una lista de grupos; esta será una lista de tuplas si el patrón tiene más de un grupo. Las coincidencias vacías se incluyen en el resultado a menos que toquen el comienzo de otra coincidencia.
¿Cuál es la forma canónica de hacer esto en Perl? Un algoritmo ingenuo en el que puedo pensar es en la línea de "mientras una búsqueda y reemplazo con la cadena vacía es exitosa, haz [suite]". Espero que haya una manera más agradable. :-)
¡Gracias por adelantado!
Usa el modificador /g
en tu partida. Del manual de perlop
:
El modificador "
/g
" especifica la coincidencia global de patrones, es decir, la coincidencia tantas veces como sea posible dentro de la cadena. Cómo se comporta depende del contexto. En el contexto de la lista, devuelve una lista de las subcadenas que coinciden con cualquier paréntesis de captura en la expresión regular. Si no hay paréntesis, devuelve una lista de todas las cadenas coincidentes, como si hubiera paréntesis alrededor de todo el patrón.En el contexto escalar, cada ejecución de "
m//g
" encuentra la siguiente coincidencia, devolviendo verdadero si coincide, y falso si no hay más coincidencias. La posición después de la última coincidencia se puede leer o establecer utilizando la funciónpos()
; ver "pos
" enperlfunc
. Una coincidencia fallida normalmente restablece la posición de búsqueda al comienzo de la cadena, pero puede evitar eso agregando el modificador "/c
" (por ejemplo, "m//gc
"). La modificación de la cadena objetivo también restablece la posición de búsqueda.
Buena referencia para principiantes con contenido similar a la respuesta de @kyle : Perl Tutorial: uso de expresiones regulares