Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在文本文件中搜索字符串时如何包含空格_Python_Counter_Traversal - Fatal编程技术网

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.