Использование re.finditer не вернет все совпадения - PullRequest
1 голос
/ 24 мая 2019

Я делал простой колоризатор в python.Он использует re.finditer для поиска индекса всех слов между кавычками и раскраски этих слов в текстовом поле tkinter.По какой-то причине, когда открывается окно, не все слова были найдены.Вот мой код:

import tkinter as tk
import re

def htmlbasiccolorer(self):
        def find2(self, color, warning):
                    string = (str(self.get("1.0",tk.END)))
                    lines=string.split("\n")
                    for i,line in enumerate(lines):
                                y=(i+1)
                                for e in re.finditer(r'"(.*?)"', line):
                                    startindex= e.start()
                                    endindex= e.end()
                                    startindex=(str(y)+'.'+(str(startindex)))
                                    endindex=(str(y)+'.'+(str(endindex)))
                                    startindex=float(startindex)
                                    endindex=float(endindex)
                                    startindex=(round(float(startindex), 2))
                                    endindex=(round(float(endindex), 2))
                                    self.tag_configure(warning, background="white", foreground=color)
                                    self.tag_add(warning, startindex, endindex)
        find2(self, "purple", "id-6")
s=tk.Tk()
s.geometry('1000x600')
t=tk.Text(s)
t.insert(tk.END, """
<!DOCTYPE html>
<html
  xmlns="http://www.w3.org/1999/xhtml"
  xml:lang="en-US"
  lang="en-US"
  dir="ltr"
  xmlns:fb="http://ogp.me/ns/fb#" xmlns:og="http://ogp.me/ns#"
  class=" user-logged-out">

<head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# game: http://ogp.me/ns/game#">
        <meta charset="utf-8" />
    <meta name="ROBOTS" content="NOODP" />
    <meta name="ROBOTS" content="NOYDIR" />
        <meta name="verify-v1" content="TgxixMKtxcQ+9NUdD7grKbzw3tAl3iJWlTPSPKt9t0I=" />
    <meta name="p:domain_verify" content="314c7ba9469cc171a12a46b43e0e2aed" />
    <meta name="google-site-verification" content="n7BdKb0xn1E9tRJXvmMxE3Ynr-QajBOi1yA1srT4Nrc" />
    <meta name="apple-itunes-app" content="app-id=329218549">

              <meta name="description" content="Play chess on Chess.com - the #1 chess community with +20 million members around the world. Play online with friends, challenge the computer, join a club, solve puzzles, analyze your games, and learn from hundreds of video lessons. You can also watch top players and compete for prizes." />

        <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">

    <link rel="preconnect" href="//betacssjs.chesscomfiles.com">
  <link rel="preconnect" href="//images.chesscomfiles.com">

    <link rel="dns-prefetch" href="//betacssjs.chesscomfiles.com">
  <link rel="dns-prefetch" href="//images.chesscomfiles.com">

    <link
    as="font"
    crossorigin="crossorigin"
    href="/bundles/web/fonts/chessglyph-regular.d4a95b80.woff2"
    rel="preload"
    type="font/woff2">

    <link rel="publisher" href="https://plus.google.com/+chess"/>

    <link rel="apple-touch-icon" href="https://betacssjs.chesscomfiles.com
    <div id="challenge-popover"></div>
    <div id="message-popover"></div>
    <div id="modal-video"></div>
    <div id="trophy-popover"></div>
    <div id="user-popover"></div>
    </body>
</html>

""")
t.pack(expand=1, fill=tk.BOTH)
htmlbasiccolorer(t)
s.mainloop()

Ниже приведен пример того, как это выглядит.Фиолетовый текст был найден, а черный - нет.Часть текста между двумя кавычками по-прежнему черная.enter image description here Я использую python 3.6 для Windows 10. Любая помощь будет чрезвычайно признательна.

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Вы используете float для индексов текстовых виджетов.Индексы не являются числами с плавающей запятой, это строки вида строка . столбец .Затем вы делаете странный выбор округления индекса вверх или вниз.

Давайте посмотрим на «NOYDIR» в качестве примера, поскольку вы утверждаете, что он не находит.С помощью всего лишь одного оператора печати вы увидите, что он находит NOYDIR, но вычисляемые индексы имеют значение 14,32 в качестве начала и 14,4 в качестве конца.Поскольку конечный индекс находится перед начальным индексом (символ 4 перед символом 32), tkinter не будет выделять это слово.

Почему второй индекс 14.4?Это потому, что e.start() возвращает 40. Вы конвертируете это в число с плавающей точкой, добавляя "."и значение в строке, получая «1,40».Затем вы конвертируете его в число с плавающей точкой, которое преобразует «1,40» в «1,4».Именно поэтому вы не должны рассматривать индексы текстовых виджетов как плавающие.Индекс представляет собой строку в форме строка . столбец .Когда вы конвертируете его в число с плавающей точкой, значение «14,40» не отличается от «14,4», но для текстового виджета «14,40» и «14,4» это очень разные вещи.

0 голосов
/ 24 мая 2019

В документации tkinter я обнаружил, что индекс должен передаваться как строка , содержащая номер строки и столбца, разделенные точкой.

Так что это выглядит странномне, что вы меняете индексы на float и затем округляете их.

Я думаю, эти инструкции должны быть отброшены.

...