2013-12-09 58 views
5

我這是在一個if語句作爲的Python re模塊來挑選翻譯一個Perl的正則表達式

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

我試圖找出最好的方式來複制這個Perl的正則表達式/VA=\d+:(\S+):ENSG/在python會。現在我有

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

這是翻譯它的好方法嗎?我想這是perl實際上比python更可讀的區域。

請注意,python正則表達式是編譯的,因爲接下來的三行實際上是在一個循環內。

+0

無需'如果this_re不None'那裏。在python中,通常只會說'if this_re_re:'。 –

+1

我被教導使用不是None,因爲它更清晰,因爲沒有!= False –

回答

3

你可以使用

gene = this_re.group(1) 

,而不是

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

順便提一下,Python的re模塊緩存N最近使用正則表達式模式,所以(除非你有一個非常大量的模式),沒有必要預先編譯它。

對於Python 2.7,re._MAXCACHE(即N)爲100。

+0

我不知道那個非常酷的緩存。一個問題 - 不應該是組(0)而不是組(1)? –

+1

儘管Python使用基於0的索引,但正則表達式組從1開始編號。因此它是「group(1)」。這與使用're.sub'時引用組1匹配的'r'\ 1''一致。 – unutbu

+0

從解釋器:>>> p = re.match('a','aa') >>> p.group(0) 'a' –

相關問題