2015-04-05 66 views
0

我試圖用正則表達式解析數據文件。該文件的結構如下,例如:Python正則表達式:計數外觀

[foo1.uA] 
[foo1.uA] 
[foo1.uB] 
[foo1.uA foo1.uB] 
[foo1.uA foo1.uD] 
[foo1.uD foo1.uA] 
[foo1.uA foo1.uB foo1.uD] 

在這個例子中,所需的結果是:

Only uA = 2 
Only uB = 1 
uA and uB = 1 
uA and uD = 2 
uA, uB, uD = 1 

對於初學者,我對所有可能的結構變量,但我不知道這是如何可以/應該使用正則表達式進行解析。任何援助將不勝感激,謝謝!

澄清: 我試圖做的是使用re.search:

matchLine = re.search(r'foo1.uA', line, re.I|re.S) 
if (matchLine): 
    relevantLines.append(line) 

但是當時我不知道如何來分隔不同的可能性 - 對於那些只與微安出場,或UB ,或超過2.

+0

如果什麼輸入是'[foo1.uA foo1.uB foo2.uD]'? – 2015-04-05 07:39:24

+0

@AvinashRaj,那不會發生 – ygoncho 2015-04-05 07:41:39

+0

@ygoncho您最後的評論與'[foo1.uA foo1.uD]'與'[foo1.uD foo1.uA]'計數相同'的事實不一致。或者我錯過了什麼? – 2015-04-05 08:40:32

回答

2

正則表達式用於模式匹配而不用於計數。

人們會使用Python的字符串操作:

from collections import Counter 

def parse_lines(lines): 
    for line in lines: 
     yield tuple(line.strip()[1:-1].split()) 

def main(): 
    with open(filename) as lines: 
     result = Counter(parse_lines(lines)) 
    for key, cnt in result.items(): 
     print key, '=', cnt 
2

您可以使用計數器的組合和正則表達式:

l = [ 
    "foo1.uA", 
    "foo1.uA", 
    "foo1.uB", 
    "foo1.uA foo1.uB", 
    "foo1.uA foo1.uD", 
    "foo1.uD foo1.uA", 
    "foo1.uA foo1.uB foo1.uD" 
] 

import re 
from collections import Counter 
c = Counter(frozenset(re.compile(r"foo1\.u.").findall(s)) for s in l) 

結果:

>>> c 
Counter({frozenset(['foo1.uA', 'foo1.uD']): 2, frozenset(['foo1.uA']): 2, frozenset(['foo1.uA', 'foo1.uB', 'foo1.uD']): 1, frozenset(['foo1.uB']): 1, frozenset(['foo1.uA', 'foo1.uB']): 1}) 
+1

而不是'tuple(sorted(...))'你也可以使用'frozenset'而不是......例如:'c = Counter(frozenset(re.findall (r'foo1 \ .u。',s))for s in l)' – 2015-04-05 09:25:51