2008-11-14 22 views
16

¿Es posible realizar una coincidencia de grupo con nombre en la sintaxis de expresiones regulares de Perl como con la de Python? Siempre vinculo 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.¿Puedo usar grupos con nombre en una expresión regular de Perl para obtener los resultados en un hash?

Python lo hace así:

>>> import re 
>>> regex = re.compile(r'(?P<count>\d+)') 
>>> match = regex.match('42') 
>>> print match.groupdict() 
{'count': '42'} 

Sé que el ?P indica que se trata de una característica de expresiones regulares en Python específica, pero espero que es en Perl de una manera diferente o se añadió más tarde. ¿Hay alguna forma de obtener un hash de resultados de manera similar en Perl?

+1

Para la capacidad de búsqueda del motor de búsqueda: los grupos con nombre también se denominan a veces "nombres de grupos simbólicos". – conny

Respuesta

36

Perl usa (?<NAME>pattern) para especificar las capturas de nombres. Tienes que usar el hash %+ para recuperarlos.

$variable =~ /(?<count>\d+)/; 
print "Count is $+{count}"; 

Esto solo es compatible con Perl 5.10 y versiones posteriores.

+4

'/ (? 'Count' \ d +) /' funciona también. –

+3

También puede usar '% -' para acceder a las capturas. –

+1

Esta respuesta se ha agregado a [Preguntas frecuentes sobre la expresión regular de desbordamiento de pila] (http://stackoverflow.com/a/22944075/2736496), debajo de "Grupos". – aliteralmind

4

AFIK PCRE ha llamado grupo de captura como:

(?'NAME'pattern) 
(?<NAME>pattern) 

Puede encontrar información here.

18

A partir de Perl 5.10, las expresiones regulares de Perl admiten some Python features, 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 obtener más información:

Defina un búfer de captura con nombre. Equivalente a (?<NAME>pattern).

(?P<NAME>pattern) 

Referencia reversa a un buffer de captura nombrado. Equivalente a \g{NAME}.

(?P=NAME) 

Subrutina llamada a un buffer de captura con nombre. Equivalente a (?&NAME).

(?P>NAME) 

Aunque no añadí el Python-compatibilidad con la última edición de Learning Perl, nosotros cubrimos los nuevos Perl 5.10 características, incluyendo capturas con nombre.

+1

Por favor, aclare cuál es la sintaxis de Perl y cuál la de Python. – ysth

+0

La sintaxis con el P adicional es python. –

+1

Son todos sintaxis de Perl. –

9

Como mucha gente dijo que perl 5.10 ha nombrado grupos.

Pero en perlas anteriores se puede hacer algo, no es tan conveniente, pero relativamente agradable:

my %hash; 
@hash{"count", "something_else"} = $string =~ /(\d+)\s*,\s*(\S+)/; 

y luego se puede utilizar:

$ picadillo { "recuento"} y $ picadillo {" algo más"}.

+0

+1 Prefiero esto más de $ 1, $ 2, ... ¡cualquier día! Gracias por el consejo. – cdleary

Cuestiones relacionadas