Форум сайта python.su
Пытаюсь сделать подсветку синтаксиса.
Как выловить часть строки начинающейся с пробела и заканчивающаяся открывающей скобкой?
Так, чтобы сама скобка не окрашивалась?
Моя регулярка для этого в finditer:
['\ (\w+)\(', function]
Отредактировано ZIL130 (Янв. 8, 2024 15:07:00)
Офлайн
# 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")
Офлайн
Так и тут скобка будет окрашиваться – к части текста применяются теги(цвет).
И там ещё не только дэфы, но и классы.
Я пробовал в регулярку ставить ? :
['\ (\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]
Отредактировано ZIL130 (Янв. 8, 2024 19:09:13)
Офлайн
совсем неясно что у вас красится
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")
Офлайн
Полный код:
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()
Офлайн
ZIL130
Как выловить часть строки начинающейся с пробела и заканчивающаяся открывающей скобкой?
Так, чтобы сама скобка не окрашивалась?
\s(\w+)(?=\()
Офлайн
Вот спасибо добрый человек.
Правда я тут и сам допетрил, но у вас лучше выражение.
Офлайн
Используйте регулярное выражение r'(?<=\s)(\w+)(?=\()', чтобы захватить только название функции или класса без скобки. agar io
Офлайн
Чтобы выделить часть строки, начинающуюся с пробела и заканчивающуюся открывающей скобкой, но без самой скобки, нужно немного изменить вашу регулярку. Мы можем использовать захватывающие группы, чтобы захватить только имя функции или класса, а не саму скобку. Mapquest Directions
Офлайн
> Пытаюсь сделать подсветку синтаксиса.
Используй https://pygments.org/
Офлайн