2010-04-13 100 views
6

我對Perl和Ruby非常有經驗,但是對Python來說是新手,所以我希望有人能夠告訴我Pythonic方式來完成以下任務。我想比較幾行與多個正則表達式並檢索匹配的組。在Ruby中它會是這樣的:Python與幾個正則表達式比較字符串

# Revised to show variance in regex and related action. 
data, foo, bar = [], nil, nil 
input_lines.each do |line| 
    if line =~ /Foo(\d+)/ 
    foo = $1.to_i 
    elsif line =~ /Bar=(.*)$/ 
    bar = $1 
    elsif bar 
    data.push(line.to_f) 
    end 
end 

我在Python的嘗試都轉向了相當難看,因爲匹配組從調用返回匹配一個正則表達式/搜索和Python在條件語句不轉讓或切換語句。對於這個問題,Pythonic怎麼做(或想想)?

+1

請參閱http://stackoverflow.com/questions/2554185/match-groups-in-python。 – PaulMcG 2010-04-13 23:30:47

+0

是的,那個問題是我在找的 - 謝謝! – maerics 2010-04-13 23:53:06

回答

0

使用中間類REMatcher它執行匹配,存儲該匹配組,並返回成功的布爾的Paul McGuire's solution /失敗原來以產生用於該目的的最清晰的代碼。

1

這樣的事情,但是更漂亮:

regexs = [re.compile('...'), ...] 

for regex in regexes: 
    m = regex.match(s) 
    if m: 
    print m.groups() 
    break 
else: 
    print 'No match' 
+1

我嘗試了類似的東西,但我想根據哪個正則表達式匹配採取不同的操作,所以我從一個列表移動到一個字典,將正則表達式映射到lambdas,以便在找到匹配的情況下調用lambdas,但它會產生一些令人困惑的代碼。 – maerics 2010-04-13 23:00:47

1

有幾種方法來「綁定在運行一個名爲」在Python,如我的老recipe的「分配和測試」;在這種情況下,我可能會選擇另一種這樣的方式(假設的Python 2.6,需要如果你正在使用舊版本的Python工作的一些細微變化),是這樣的:

import re 
pats_marks = (r'^A:(.*)$', 'FOO'), (r'^B:(.*)$', 'BAR') 
for line in lines: 
    mo, m = next(((mo, m) for p, m in pats_mark for mo in [re.match(p, line)] if mo), 
       (None, None)) 
    if mo: print '%s: %s' % (m, mo.group(1)) 
    else: print 'NO MATCH: %s' % line 

許多微小的細節可以調節,當然(例如,我只是選擇了(.*)而不是(.*?)作爲匹配組 - 它們與立即跟隨的$相同,因此我選擇了較短的形式;-) - 您可以預編譯RE,將事情分解成不同的比pats_mark元組(例如,具有由RE模式索引的字典)等等。

但我認爲,實質性的想法是讓st並且將匹配對象與動態名稱綁定在一起,子表達式爲for mo in [re.match(p, line)],單個項目列表中的「循環」(genexps僅通過循環綁定名稱,而不是通過賦值來綁定名稱 - 有些人考慮使用此部分genexps的規格是「棘手」,但我認爲它是一個完全可以接受的Python成語,尤其是。因爲,當時正在設計listcomps,genexps的「祖先」)。

-1

你的正則表達式只需要第三個字符之後的任何東西。

for line in open("file"): 
    if line.startswith("A:"): 
     print "FOO #{"+line[2:]+"}" 
    elif line.startswith("B:"): 
     print "BAR #{"+line[2:]+"}" 
    else: 
     print "No match" 
+0

不錯的方式,但我會使用拆分和比較: 開始,休息= line.split(':',1) 如果開始==「A」:等等...... – moshez 2010-04-13 23:33:29

+0

這是好的,但我是尋找更一般的東西,簡單的正則表達式只是爲了解釋的目的,實際的正則表達式會相當複雜。 – maerics 2010-04-13 23:52:17