Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 8, 2024 15:04:33

ZIL130
Зарегистрирован: 2022-10-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Пытаюсь сделать подсветку синтаксиса.
Как выловить часть строки начинающейся с пробела и заканчивающаяся открывающей скобкой?
Так, чтобы сама скобка не окрашивалась?
Моя регулярка для этого в finditer:

 ['\ (\w+)\(', function]
.
Тут окрашивается сама скобка.
А хочется чтобы окрашивалось только название функции или класса: class Abba(): или def abba(): .

Отредактировано ZIL130 (Янв. 8, 2024 15:07:00)

Офлайн

#2 Янв. 8, 2024 16:57:07

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2605
Репутация: +  62  -
Профиль   Отправить e-mail  

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

 # Use regular expression to extract the function name
match = re.search(r"^def\s+(.+?)\(", s)
if match:
 # Return the captured group (function name)
 print(match.group(1))
else:
 print("No function name found")



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Янв. 8, 2024 18:53:51

ZIL130
Зарегистрирован: 2022-10-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Так и тут скобка будет окрашиваться – к части текста применяются теги(цвет).
И там ещё не только дэфы, но и классы.
Я пробовал в регулярку ставить ? :

 ['\ (\w+?)\(', function]
– всё равно красит скобку.
Но спасибо за потраченное время на нуба.
Сопсно вот функция:
 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()}")
            )
    return matches
где
 repl = ['\ (\w+?)\(', function]
где function – название паттерна к которому применяется цвет.
Может нужен весь код?

Отредактировано ZIL130 (Янв. 8, 2024 19:09:13)

Офлайн

#4 Янв. 8, 2024 19:50:43

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2605
Репутация: +  62  -
Профиль   Отправить e-mail  

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

совсем неясно что у вас красится

 s = "def my_fuc(param=1)"
 # Use regular expression to extract the function name
match = re.search(r"^def\s+(.+?)\(", s)
if match:
 # Return the captured group (function name)
 print(match.group(1))
else:
 print("No function name found")

вернет my_func



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#5 Янв. 8, 2024 21:08:16

ZIL130
Зарегистрирован: 2022-10-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Полный код:

 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()}")
            )
    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],
    ['\ (\w+)\(', function]
]
# Создайте текстовый виджет
# Добавьте большую ширину границы, чтобы мы могли добиться небольшого отступа
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()

Офлайн

#6 Янв. 9, 2024 21:54:51

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1314
Репутация: +  113  -
Профиль   Отправить e-mail  

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

ZIL130
Как выловить часть строки начинающейся с пробела и заканчивающаяся открывающей скобкой?
Так, чтобы сама скобка не окрашивалась?


\s(\w+)(?=\()

Офлайн

#7 Янв. 10, 2024 22:27:18

ZIL130
Зарегистрирован: 2022-10-29
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

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

Вот спасибо добрый человек.
Правда я тут и сам допетрил, но у вас лучше выражение.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version