2013-12-09 12 views
5

Ich habe das Perl regular expression /VA=\d+:(\S+):ENSG/, die das, was der beste Weg, um herauszufinden, ich versuche, in einer if-Anweisung alsWhich Python re-Modul zum Übersetzen ein Perl regular expression

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

verwendet wird, holen zu replizieren in Python wäre. Jetzt habe ich

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)] 

Ist das ein guter Weg, um es zu übersetzen? Ich denke, das ist ein Bereich, in dem Perl tatsächlich lesbarer ist als Python.

Beachten Sie, dass der reguläre Ausdruck Python kompiliert wird, da die nächsten drei Zeilen tatsächlich in einer Schleife sind.

+0

Keine Notwendigkeit für 'wenn this_re nicht da ist None'. In Python würde man normalerweise nur sagen, wenn this_re: '. –

+1

wurde mir beigebracht, nicht zu verwenden, weil es besser lesbar ist und weil keine! = Falsch –

Antwort

3

könnten Sie verwenden

gene = this_re.group(1) 

statt

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

By the way, das Python re Modul speichert die N zuletzt regex Muster verwendet, so (es sei denn, Sie haben sehr eine große Anzahl von Mustern) ist es nicht notwendig, sie vorher zu kompilieren.

für Python 2.7, re._MAXCACHE (d N) ist 100.

+0

Ich wusste nicht, dass über die Zwischenspeicherung das ist sehr cool. Eine Frage - sollte es nicht Gruppe (0) nicht Gruppe (1) sein? –

+1

Obwohl Python 0-basierte Indizierung verwendet, werden die Regex-Gruppen mit 1 beginnend nummeriert. Also ist es "Gruppe (1)". Dies ist konsistent mit 'r' \ 1 '', was sich auf die Übereinstimmung der Gruppe 1 bezieht, wenn 're' verwendet wird. – unutbu

+0

Vom Interpreter: >>> p = re.match ('a', 'aa') >>> p.gruppe (0) 'a' –