每位用户都采用以下两种方式之一进行标记:[donorStatus] => donor
或[donorStatus] => notADonor
。
字符串notADonor
是唯一的,因此我可以使用以下函数成功计算它的实例。但是,donor
出现在文件中的其他较长字符串中,因此我想搜索更具体的字符串,如=> donor
。
每次搜索都会产生0,所以我认为这是抛弃它的白色空间,我无法弄清楚如何解决这个问题。任何帮助,将不胜感激。谢谢!
from collections import Counter;
count = Counter();
for line in open ('data.txt', 'r'):
for word in line.split():
count[word] += 1
print count['=> donor']
答案 0 :(得分:2)
问题是split()
会拆分每个空格,包括>
和donor
之间的空格。要在每个空格处拆分,除了前面有>
的空格,请使用re.split('(?<!>)\s+', line)
:
import re
from collections import Counter
count = Counter()
for line in open ('data.txt', 'r'):
for word in re.split('(?<!>)\s+', line):
count[word] += 1
print count['=> donor']
正则表达式解释:
(?<!a)b
是negative lookbehind匹配每个b
不在a
之前的表达式。因此,(?<!>)\s+
会匹配前面没有\s+
的每个空白字符(>
)。
答案 1 :(得分:1)
使用split
,count
和sum
;
with open('data.txt') as f:
lines = f.readlines()
仅选择我们感兴趣的行
possible = [ln.strip().split() for ln in lines if '[donorStatus]' in ln]
现在找到捐赠者;
print sum(ln.count('donor') for ln in possible)
答案 2 :(得分:1)
使用正则表达式。
import re
from collections import Counter;
count = Counter();
for line in open ('data.txt', 'r'):
for word in line.split():
if re.search('=> donor', line, re.I):
count[word] += 1
答案 3 :(得分:1)
这可以让你得到你想要的结果
def count(word):
counter = 0
for line in open ('c:\\data.txt', 'r'):
if word in line:
counter += 1
return counter
print count('=> donor')
答案 4 :(得分:1)
如果您只为此特定列表执行此操作并希望保持快速,我首先要检查&#34; =&gt;&#34;用于文件中的任何其他位置。
如果不是,请节省时间并使用donor_count = count['=>'] - count['notADonor']
作为常规解决方案。
否则,您可能希望将for循环更改为:
for line in open ('data.txt', 'r'):
if '=> donor' in line:
count['=> donor'] += 1
// split and continue counting as needed, etc.
或使用正则表达式,如果您要在解析中使用正则表达式来处理其他事情。否则,它不太可能值得进行此检查。