在文本文件中搜索字符串时如何包含空格

时间:2014-08-08 15:04:05

标签: python counter traversal

每位用户都采用以下两种方式之一进行标记:[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']

5 个答案:

答案 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)bnegative lookbehind匹配每个b不在a之前的表达式。因此,(?<!>)\s+会匹配前面没有\s+的每个空白字符(>)。

答案 1 :(得分:1)

使用splitcountsum;

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.

或使用正则表达式,如果您要在解析中使用正则表达式来处理其他事情。否则,它不太可能值得进行此检查。