我试图用正则表达式解析数据文件。文件结构如下,例如:
[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的外观。
答案 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})