2013-12-09 14 views
5

mam Perl wyrażenie regularne /VA=\d+:(\S+):ENSG/ który jest używany w if jakoktóry moduł Pythona re odebrać za tłumaczenia Perl wyrażenie regularne

if ($info =~ /VA=\d+:(\S+):ENSG/){ 
    $gene =$1; 

próbuję dowiedzieć się, jaki jest najlepszy sposób replikować to w python będzie. W tej chwili mam

gene_re = re.compile(r'VA=\d+:(\S+):ENSG') 
this_re = re.search(gene_re, info) 
if this_re is not None: 
    gene = info[this_re.start(0):this_re.end(0)] 

Czy to dobry sposób na przetłumaczenie? Sądzę, że jest to jeden obszar, w którym perl jest rzeczywiście bardziej czytelny niż pyton.

Należy zauważyć, że wyrażenie regularne Pythona zostało skompilowane, ponieważ następne trzy linie znajdują się w pętli.

+0

Nie potrzeba 'jeśli this_re nie ma None'. W pytonie zwykle wystarczy powiedzieć "if this_re:". –

+1

Nauczono mnie używać nie jest Brak, ponieważ jest bardziej czytelny i ponieważ None! = False –

Odpowiedz

3

Można użyć

gene = this_re.group(1) 

zamiast

gene = info[this_re.start(0):this_re.end(0)] 

Nawiasem mówiąc, moduł Pythona re buforuje N ostatnio używanych wzorców regex, tak (chyba że masz bardzo duża liczba wzorów) nie jest konieczne jego wstępne skompilowanie.

Pythona 2,7 re._MAXCACHE (tj N) wynosi 100.

+0

Nie wiedziałem o tym, że ponowne buforowanie jest bardzo fajne. Jedno pytanie - czy nie powinno być grupą (0), a nie grupą (1)? –

+1

Mimo że Python używa indeksowania opartego na 0, grupy regex są numerowane począwszy od 1. Tak więc jest to 'group (1)'. Jest to zgodne z 'r '\ 1'' odnoszącym się do dopasowania grupy 1 podczas używania' re.sub'. – unutbu

+0

Z interpretera: >>> p = rematch ("a", "aa") >>> p.group (0) 'a' –