Подсветка синтаксиса

ЗИЛ

Новичок
Пользователь
Янв 3, 2022
43
1
8
Хотелось бы написать регулярку для вылавливания части строки содержащую названия функций и классов.
Код:
Код:
from tkinter import *
import re
import os

# Setup Tkinter
root = Tk()
root.minsize(width=500, height=500)
root.title('SintaxLight')


# Функция выполнения текущего файла
def execute(event=None):

    # Запишите содержимое во временный файл
    with open('run.py', 'w', encoding='utf-8') as f:
        f.write(editArea.get('1.0', END))

    # Start the File in a new CMD Window
    os.system('start cmd /K "python run.py"')

# Регистрация изменений внесенных в содержимое редактора
def changes(event=None):
    global previousText

    # Если на самом деле никаких изменений внесено не было, остановите / верните функцию
    if editArea.get('1.0', END) == previousText:
        return

    # Удалите все теги, чтобы их можно было перерисовать
    for tag in editArea.tag_names():
        editArea.tag_remove(tag, "1.0", "end")

    # Добавьте теги, в которых функция search_re нашла шаблон
    i = 0
    for pattern, color in repl:
        for start, end in search_re(pattern, editArea.get('1.0', END)):
            editArea.tag_add(f'{i}', start, end)
            editArea.tag_config(f'{i}', foreground=color)

            i+=1

    previousText = editArea.get('1.0', END)

def search_re(pattern, text, groupid=0):
    matches = []

    text = text.splitlines()
    for i, line in enumerate(text):
        for match in re.finditer(pattern, line):

            matches.append(
                (f"{i + 1}.{match.start()}", f"{i + 1}.{match.end()}")
            )
    print(matches)
    return matches

# Функция преобразования RGB в HEX
def rgb(rgb):
    return "#%02x%02x%02x" % rgb


previousText = ''

# Определите цвета для различных типов токенов
normal = rgb((234, 234, 234))
keywords = rgb((234, 95, 95))
comments = rgb((95, 234, 165))
string = rgb((234, 162, 95))
function = rgb((95, 211, 234))
#background = rgb((42, 42, 42))
font = 'Consolas 15'


# Определите список шаблонов регулярных выражений, которые должны быть окрашены определенным образом
repl = [
    ['(^| )(False|None|True|and|as|assert|async|await|break|class|continue|def|del|elif|else|except|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|raise|return|try|while|with|yield)($| )', keywords],
    ['".*?"', string],
    ['\'.*?\'', string],
    ['#.*?$', comments],
    ['def\s+(.+?)\(', function] #в оригинале здесь: '\ (\w+)\('
]

# Создайте текстовый виджет
# Добавьте большую ширину границы, чтобы мы могли добиться небольшого отступа
editArea = Text(
    root,
    #background=background,
    foreground=normal,
    insertbackground=normal,
    relief=FLAT,
    borderwidth=30,
    font=font
)

# Разместите область редактирования с помощью метода упаковки
editArea.pack(
    fill=BOTH,
    expand=1
)

# IВставьте какой-нибудь стандартный текст в область редактирования
editArea.insert('1.0', """from argparse import ArgumentParser
from random import shuffle, choice
import string

# Setting up the Argument Parser
parser = ArgumentParser(
    prog='Password Generator.',
    description='Generate any number of passwords with this tool.'
)
""")

# Привяжите KeyRelase к функции изменений
editArea.bind('<KeyRelease>', changes)

# Привязать Control + R к функции exec
root.bind('<Control-r>', execute)

changes()
root.mainloop()

Как видите тут у меня регулярка
Код:
'\ (\w+)\('
-- но тогда окрашивается и сама скобка. А так как написано сейчас -- красит и def.
Можно ли сделать так чтобы окрашивались только названия функций и классов?
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 668
475
83
'\ (\w+)'
 

ЗИЛ

Новичок
Пользователь
Янв 3, 2022
43
1
8
Хммм -- так будет красить вообще любое слово. Ведь перед любым словом -- пробел.
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
435
119
43
может так?
r'\b(?:def|class)\s+([a-zA-Z_]\w*)'
 
  • Мне нравится
Реакции: Student

ЗИЛ

Новичок
Пользователь
Янв 3, 2022
43
1
8
Попробую. Вроде бы то, но покажет только практика.
Попробовал.
Не работает.
 
Последнее редактирование:

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
435
119
43
У меня работает. Покажи пример как и что запускал
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
973
219
43
21
Москва
'\ (\w+)(?=\()'

Screenshot_2024-01-10-09-04-18-30_d365b52accad0f47adbc08c16219827d.jpg
 

ЗИЛ

Новичок
Пользователь
Янв 3, 2022
43
1
8
Там вверху есть полный код.
Вот сюда нужно вставить регулярку:
Код:
# Определите список шаблонов регулярных выражений, которые должны быть окрашены определенным образом
repl = [
    ['(^| )(False|None|True|and|as|assert|async|await|break|class|continue|def|del|elif|else|except|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|raise|return|try|while|with|yield)($| )', keywords],
    ['".*?"', string],
    ['\'.*?\'', string],
    ['#.*?$', comments],
    ['def\s+(.+?)\(', function] #в оригинале здесь: '\ (\w+)\(' ВОТ СЮДА!
]
Потом -- запускаешь код и смотришь.
 

Форум IT Специалистов