У меня есть код, который читает файлы и находит соответствующее выражение с вводом пользователя и выделяет его, используя функцию найти все в регулярном выражении.
также я пытаюсь сохранить в json файл некоторую информацию, основанную на этом сопоставлении.
нравиться :
проблема в том, что программа считывает файл и отображает текст с выделенным выражением, но в файле json сохраняет количество вхождений как количество строк.
в этом примере слово это - это искомое слово, которое оно существует в текстовом файле дважды
результат в json файл будет = 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")






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