Хотелось бы написать регулярку для вылавливания части строки содержащую названия функций и классов.
Код:
Как видите тут у меня регулярка
-- но тогда окрашивается и сама скобка. А так как написано сейчас -- красит и def.
Можно ли сделать так чтобы окрашивались только названия функций и классов?
Код:
Код:
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+)\('
Можно ли сделать так чтобы окрашивались только названия функций и классов?