2008-11-14 9 views
16

Czy jest możliwe wykonanie dopasowania nazwanego grupy w składni wyrażeń regularnych Perla, tak jak w przypadku Pythona? Zawsze wiążę wartości $n z odpowiednimi nazwami po dopasowaniu, więc byłoby mi wygodniej zrobić to w samym regexie, jeśli jest to możliwe.Czy mogę użyć nazwanych grup w wyrażeniu regularnym Perla, aby uzyskać wyniki w haszowaniu?

Python robi to tak:

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

Wiem ?P wskazuje, że jest to funkcja regex Pythona specyficzne, ale mam nadzieję, że to w Perlu w inny sposób lub został dodany później. Czy jest jakiś sposób, aby uzyskać wynik mieszania w podobny sposób w Perl?

+1

Aby znaleźć wyszukiwarkę: nazwane grupy są czasami nazywane również "symbolicznymi nazwami grup". – conny

Odpowiedz

36

Perl używa (?<NAME>pattern) do określania przechwyconych nazw. Musisz użyć hashu %+, aby je odzyskać.

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

Jest to obsługiwane tylko w Perlu 5.10 i wyżej.

+4

'/ (? 'Count' \ d +) /' działa również. –

+3

Możesz również użyć '% -', aby uzyskać dostęp do przechwytów. –

+1

Ta odpowiedź została dodana do [Często zadawanych błędów w przepełnieniu stosu] (http://stackoverflow.com/a/22944075/2736496) w części "Grupy". – aliteralmind

4

Afik PCRE nazwał grupa przechwytywanie jak:

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

można znaleźć informacje here.

18

Od wersji Perl 5.10, wyrażeń regularnych Perla obsługuje some Python features, co czyni je zgodne z Python zgodne z regexes, jak sądzę. Wersje Pythona mają w sobie "P", ale wszystkie działają w Perlu 5.10. Szczegółowe informacje można znaleźć w dokumentacji perlre:

Zdefiniuj nazwany bufor przechwytywania. Odpowiednik (?<NAME>pattern).

(?P<NAME>pattern) 

Odsyłacze do nazwanego bufora przechwytywania. Odpowiednik \g{NAME}.

(?P=NAME) 

Wywołanie podprogramu do określonego bufora przechwytywania. Odpowiednik (?&NAME).

(?P>NAME) 

Mimo, że nie dodać python-kompatybilność z najnowszym wydaniu Learning Perl, mamy pokrycie nowych Perl 5.10 funkcji, w tym o nazwie zrzuty.

+1

Proszę wyjaśnić, która to składnia Perla, a która Python. – ysth

+0

Składnia z dodatkowym P jest python. –

+1

Wszystkie są składnią Perla. –

9

Kilka osób twierdzi, że perl 5.10 nazywa grupy.

Ale w poprzednich perls można coś zrobić, a nie wygodne, ale stosunkowo Nicea:

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

a następnie można użyć:

$ hash { "Count"} oraz $ hash {” coś innego"}.

+0

+1 Wolę to ponad 1 $, 2 $, ... anyday! Dzięki za wskazówkę. – cdleary

Powiązane problemy