2015-04-05 69 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