Python正则表达式:计数外观
问题描述:
我试图用正则表达式解析数据文件。该文件的结构如下,例如: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.
答
正则表达式用于模式匹配而不用于计数。
人们会使用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
答
您可以使用计数器的组合和正则表达式:
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
如果什么输入是'[foo1.uA foo1.uB foo2.uD]'? – 2015-04-05 07:39:24
@AvinashRaj,那不会发生 – ygoncho 2015-04-05 07:41:39
@ygoncho您最后的评论与'[foo1.uA foo1.uD]'与'[foo1.uD foo1.uA]'计数相同'的事实不一致。或者我错过了什么? – 2015-04-05 08:40:32