Найти - Пользователи
Полная версия: Подсветка синтаксиса
Начало » Python для новичков » Подсветка синтаксиса
1
ZIL130
Пытаюсь сделать подсветку синтаксиса.
Как выловить часть строки начинающейся с пробела и заканчивающаяся открывающей скобкой?
Так, чтобы сама скобка не окрашивалась?
Моя регулярка для этого в finditer:
 ['\ (\w+)\(', function]
.
Тут окрашивается сама скобка.
А хочется чтобы окрашивалось только название функции или класса: class Abba(): или def abba(): .
ZerG
 # 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")
ZIL130
Так и тут скобка будет окрашиваться – к части текста применяются теги(цвет).
И там ещё не только дэфы, но и классы.
Я пробовал в регулярку ставить ? :
 ['\ (\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 – название паттерна к которому применяется цвет.
Может нужен весь код?
ZerG
совсем неясно что у вас красится
 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
ZIL130
Полный код:
 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()
xam1816
ZIL130
Как выловить часть строки начинающейся с пробела и заканчивающаяся открывающей скобкой?
Так, чтобы сама скобка не окрашивалась?


\s(\w+)(?=\()
ZIL130
Вот спасибо добрый человек.
Правда я тут и сам допетрил, но у вас лучше выражение.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB