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

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

Программа отлично работает, когда пользователь вводит одно слово, но ничего не показывает, когда он вводит более 1 слова.

где ошибка в моей функции?

  • х - 1 слово, введенное пользователем
  • z больше 1 слова
  • d для создания словаря

код:

def HighLight(self,x,TextString,RepX):
        thematch=TextString.replace(x,RepX)
        TheCount=TextString.count(x)
        self.textEdit_PDFpreview.insertHtml(str(thematch))
        return thematch     



def MatchFunc(self):            # Function to highlight the found criteria and display it in the right pane
    self.textEdit_PDFpreview.clear()
    self.x = self.lineEditSearch.text().strip()
    TextString=self.ReadingFileContent(self.FileListSelected())
    self.z = ""
    counter = 0 
    self.d = defaultdict(list)  
    self.filename = os.path.basename(self.FileListSelected())

    for counter , myLine in enumerate(self.filename):
        y=list(self.x.split())
        print(y)       

        for self.z in y:                
            RepX='<u><b style="color:#FF0000">'+self.z+'</b></u>'                
            self.textEdit_PDFpreview.clear()

            if self.z in TextString:
                self.d[self.z].append(counter + 1)                        
                TextString = self.HighLight(self.z,TextString,RepX)


            elif self.x in TextString:
                RepX='<u><b style="color:#FF0000">'+self.x+'</b></u>'
                self.textEdit_PDFpreview.clear()
                self.d[self.x].append(counter + 1)                                        
                self.HighLight(self.x,TextString,RepX)

1 Ответ

0 голосов
/ 16 мая 2018

В вашем коде несколько проблем.

  1. if " " in self.x: не требуется.Просто разделите ваш ввод, если нет пробелов, он вернет list с одним element
  2. Нет необходимости передавать sep=" " в split, это поведение по умолчанию
  3. Дублирующий код: как только вы сделаете выше двух, вам не понадобится цикл if-else.Сначала split, self.x, а затем for loop on y.

Относительно того, почему он не работает для нескольких входов, это, вероятно, связано с:

TextString = self.HighLight(self.z,TextString,RepX)

В else вы не сохраняете значение return из этого, но можете точно сказать, только если покажете нам, что делает self.HighLight.

Обновление:

Вы проверяете self.z in TextString: в цикле if, тогда как в else ваш чек self.x in TextString.self.z - это строка empty.это намеренно?Почему у вас нет одинакового чека в обоих случаях?Что касается вашего вопроса, вы ожидаете, что ваш код будет иметь одинаковое поведение, когда пользователь вводит несколько входов, в этом случае у вас должна быть одинаковая логика для обоих случаев.

Следовательно, мое первое предложение удалить дублирующийся код.

...