Python Regex:计算外观

时间:2015-04-05 07:33:42

标签: python regex

我试图用正则表达式解析数据文件。文件结构如下,例如:

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

但后来我不知道如何分开不同的可能性 - 只有uA,uB或超过2的外观。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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})