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

2 投票
5 回答
1639 浏览
提问于 2025-04-18 16:34

每个用户都有两种标记方式之一:[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 个回答

1

如果你只是为了这个特定的列表,并且想要保持速度快,我建议你先检查一下文件中是否还有其他地方使用了 "=>"。

如果没有,那就省省时间,直接用 donor_count = count['=>'] - count['notADonor'] 这样可以快速解决问题。

如果有的话,你可能需要把你的循环改成:

for line in open ('data.txt', 'r'):
    if '=> donor' in line:
        count['=> donor'] += 1
    // split and continue counting as needed, etc.

或者如果你打算在解析中使用正则表达式,可以用正则表达式来处理。不过如果只是为了这个检查,可能不值得专门引入正则表达式。

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

问题在于,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 这个表达式是用来匹配每个 b,前面没有 a 的情况,这叫做 负向前瞻。所以,(?<!>)\s+ 就是匹配所有空格字符(\s+),前面没有 > 的空格。

撰写回答