online - python regex space
¿Puedo usar grupos con nombre en una expresión regular de Perl para obtener los resultados en un hash? (4)
¿Es posible realizar una coincidencia de grupo nombrado en la sintaxis de expresiones regulares de Perl como con la de Python? Siempre ato los valores $n
a los nombres propios después de la coincidencia, por lo que me parece más conveniente hacerlo en la expresión regular si es posible.
Python lo hace así:
>>> import re
>>> regex = re.compile(r''(?P<count>/d+)'')
>>> match = regex.match(''42'')
>>> print match.groupdict()
{''count'': ''42''}
Sé que ?P
indica que es una característica de expresión regular específica de Python, pero espero que esté en Perl de una manera diferente o que se haya agregado más adelante. ¿Hay alguna forma de obtener un hash de resultados de manera similar en Perl?
A partir de Perl 5.10, las expresiones regulares de Perl admiten algunas funciones de Python , lo que las convierte en expresiones regulares compatibles con Python , supongo. Las versiones de Python tienen la "P" en ellas, pero todas funcionan en Perl 5.10. Consulte la documentación de perlre para más detalles:
Defina un buffer de captura nombrado. Equivalente al (?<NAME>pattern)
.
(?P<NAME>pattern)
Referencia a un buffer de captura nombrado. Equivalente a /g{NAME}
.
(?P=NAME)
Llamada de subrutina a un buffer de captura nombrado. Equivalente a (?&NAME)
.
(?P>NAME)
Aunque no agregué la compatibilidad con Python a la última edición de Learning Perl , sí cubrimos las nuevas características de Perl 5.10, incluidas las capturas con nombre.
Perl usa el (?<NAME>pattern)
para especificar las capturas de nombres. Tienes que usar %+
hash para recuperarlos.
$variable =~ /(?<count>/d+)/;
print "Count is $+{count}";
Esto solo es compatible con Perl 5.10 y versiones posteriores.
Como un par de personas dijeron que perl 5.10 ha nombrado grupos.
Pero en perls anteriores puedes hacer algo, no tan conveniente, pero relativamente agradable:
my %hash;
@hash{"count", "something_else"} = $string =~ /(/d+)/s*,/s*(/S+)/;
y luego puedes usar:
$ hash {"count"} y $ hash {"something_else"}.