Python 在文本文件中搜索字符串时如何包含空格
每个用户都以以下两种方式之一进行标记:Python 在文本文件中搜索字符串时如何包含空格,python,counter,traversal,Python,Counter,Traversal,每个用户都以以下两种方式之一进行标记:[donorStatus]=>捐赠者或[donorStatus]=>notadvor 字符串notador是唯一的,因此我可以使用以下函数成功地计算它的实例数。但是,provider出现在文件中其他较长的字符串中,因此我想搜索更具体的字符串,如=>provider 每次搜索结果都是0,所以我认为是空白区造成的,我不知道如何解决这个问题。任何帮助都将不胜感激。谢谢 from collections import Counter; count = Counte
[donorStatus]=>捐赠者
或[donorStatus]=>notadvor
字符串notador
是唯一的,因此我可以使用以下函数成功地计算它的实例数。但是,provider
出现在文件中其他较长的字符串中,因此我想搜索更具体的字符串,如=>provider
每次搜索结果都是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']
使用
拆分
、计数
和求和
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)
使用正则表达式
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
这会让你得到你想要的结果
def count(word):
counter = 0
for line in open ('c:\\data.txt', 'r'):
if word in line:
counter += 1
return counter
print count('=> donor')
问题是
split()
会分割每个空格,包括
和之间的空格。要在除前面有
的空格外的每个空格处拆分,请使用re.split(“(?)\s+”,第行)
:
重新导入
从收款进口柜台
计数=计数器()
对于打开的行('data.txt','r'):
对于重新拆分(“(?)\s+”,第行)中的单词:
计数[字]+=1
打印计数['=>捐赠者']
正则表达式解释:
(?)是at匹配每个b
的表达式,前面没有a
。因此,(?)\s+
匹配每个不前面有
的空白字符(\s+
),如果您只是针对这个特定列表执行此操作,并且希望保持快速,我首先检查“=>”在文件中的任何其他位置使用
如果不是,请节省您自己的时间,只需使用donor\u count=count['=>']-count['notaconsor']
即可获得恒定时间的解决方案
否则,您可能希望将for循环更改为:
for line in open ('data.txt', 'r'):
if '=> donor' in line:
count['=> donor'] += 1
// split and continue counting as needed, etc.
或者使用正则表达式,如果您要在解析过程中使用正则表达式进行其他操作。否则,仅为进行此检查就不值得导入正则表达式。您是否考虑过使用正则表达式?它们声明,尽管单词“捐赠者”在文件的其他部分独立出现,因此不起作用。它声明“出现在较长的字符串中”。我将其解释为“xxxdonoryy”,而不是“XXX-provider-YYY”。对不起,我应该说得更清楚。provider
实际上在较长的字符串和其他独立的位置都会出现。因此此函数将返回一个稍高的计数。不过,感谢您的回答。@user2901181是[donorStatus]
另一行?@RolandSmith[捐助国]=>捐赠者/notaconsor
都在一行上。捐赠者这个词的其他实例出现在其他地方。也许应该将“单词”改为“字符串”或“短语”,因为你特别要求在搜索词中包含空格谢谢你的回答。这对我来说很有意义,但出于某种原因,它返回5。我知道应该有大约80个0-900匹配,所以我不确定为什么数字这么低。@user2901181对不起,我的错误。我写了regex
以包含空格和前一个字母,使所有单词=>dono
,因为r
被截断。我已经更正了答案并测试了它。很好,它现在正按照我的需要工作。我只有我对regex有一点经验,所以我很感谢你的解释。谢谢你的帮助!@user2901181很乐意帮忙。(:谢谢你的回复。我正在扫描的文件实际上是一个PHP数组的文本表示,所以里面有很多=>
(确切地说,大约500000个…这是一个大文件).不过,您建议的修改似乎返回了一个准确的数字。
for line in open ('data.txt', 'r'):
if '=> donor' in line:
count['=> donor'] += 1
// split and continue counting as needed, etc.