как узнать количество вхождений выражения в файл, используя python - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть код, который читает файлы и находит совпадающее выражение с пользовательским вводом и выделяет его, используя функцию findall в регулярном выражении.

также я пытаюсь сохранить в json файл несколько данных, основанных на этом совпадении.

вроде:

  • имя файла
  • соответствующее выражение
  • число вхождений

проблема в том, что программа читает файл и отображает текст с выделенным выражением, но в файле json сохраняет число вхождений как число строк.

в этом примере слово this - искомое слово, которое существует в текстовом файле дважды результат в json-файле is = 12 ==> это число строк текста
результат файла json и выделенного текста

код:

def MatchFunc(self):           

    self.textEdit_PDFpreview.clear()
    x = self.lineEditSearch.text()
    TextString=self.ReadingFileContent(self.FileListSelected())
    d = defaultdict(list)  
    filename = os.path.basename(self.FileListSelected())


    RepX='<u><b style="color:#FF0000">'+x+'</b></u>'

    for counter , myLine in enumerate(filename):

        self.textEdit_PDFpreview.clear()
        thematch=re.sub(x,RepX,TextString)
        thematchFilt=re.findall(x,TextString,re.M|re.I)


        if thematchFilt:
            d[thematchFilt[0]].append(counter + 1)


            self.textEdit_PDFpreview.insertHtml(str(thematch))

        else:
            self.textEdit_PDFpreview.insertHtml('No Match Found')        

    OutPutListMetaData = []   
    for match , positions in d.items():

        print ("this is match {}".format(match))
        print("this is position {}".format(positions))

        listMetaData = {"File Name":filename,"Searched Word":match,"Number Of Occurence":len(positions)}
        OutPutListMetaData.append(listMetaData)
        for p in positions:
            print("on line {}".format(p))                    

    jsondata = json.dumps(OutPutListMetaData,indent=4)
    print(jsondata)            

    folderToCreate = "search_result"
    today = time.strftime("%Y%m%d__%H-%M")
    jsonFileName = "{}_searchResult.json".format(today)

    if not(os.path.exists(os.getcwd() + os.sep + folderToCreate)):
        os.mkdir("./search_result")
    fpJ = os.path.join(os.getcwd()+os.sep+folderToCreate,jsonFileName)
    print(fpJ)

    with open(fpJ,"a") as jsf:
        jsf.write(jsondata)
        print("finish writing")        

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Поскольку функция re.findall возвращает список, вы можете просто сделать len(result).

0 голосов
/ 25 апреля 2018

Это просто, используя Counter .Как только вы передаете итерацию, она возвращает каждый из них вместе с числом вхождений в виде кортежей.

...