如何在文本文件中搜索字符串时包含空格
每个用户都有两种标记方式之一:[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
使用 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
问题在于,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+
),前面没有 >
的空格。