Я работаю над простым анализом уценки в tkinter. Концепция заключается в том, что заголовки могут быть окружены символами звездочки, например, *Heading 1*, **Heading 2**.
Я использую регулярное выражение, чтобы найти строки в этом формате, пометить их и изменить стиль тегов.
Элемент, с которым я борюсь, - это удаление символов звездочки из текста после их поиска. Я попробовал некоторый код (включенный в комментарии), но он просто удаляет помеченный текст.
Мой код правильно находит *Heading 1* и превращает его в *Heading 1*, но не удаляет символы уценки, чтобы получить Заголовок 1
Может ли кто-нибудь помочь мне с алгоритмом удаления символов звездочки из заголовков, сохраняющих форматирование?
import tkinter as tk
from tkinter.scrolledtext import ScrolledText
from tkinter import font
class HelpDialog(tk.Toplevel):
"""Seperate window to show the results of SSO Search"""
def __init__(self, parent,text):
super().__init__(parent)
self.title("Help")
self.defaultfont = font.Font(family = "Sans Serif",size=12)
self.textbox = ScrolledText(self,height=40,width=80,font=self.defaultfont)
self.textbox.config(wrap=tk.WORD)
self.textbox.grid()
self.textbox.insert(0.0,text)
self.style()
def style(self):
self.h1font = font.Font(family = "Sans Serif", size=18, weight = "bold")
self.h2font = font.Font(family = "Sans Serif", size=14, weight = "bold")
self.h3font = font.Font(family = "Sans Serif", size=12, weight = "bold", slant = "italic")
self.textbox.tag_configure("h1",font=self.h1font)
self.textbox.tag_configure("h2",font=self.h2font)
self.textbox.tag_configure("h3",font=self.h3font)
self.tag_match(r"^[\*]{1}[\w\d -]+[\*]{1}$", "h1")
self.tag_match(r"^[\*]{2}[\w\d -]+[\*]{2}$", "h2")
self.tag_match(r"^[\*]{3}[\w\d -]+[\*]{3}$", "h3")
def tag_match(self,regex,tag):
count = tk.IntVar()
self.textbox.mark_set("matchStart", "1.0")
self.textbox.mark_set("matchEnd", "1.0")
while True:
index = self.textbox.search(regex,"matchEnd","end",count=count,regexp=True)
if index= = "": break
self.textbox.mark_set("matchStart",index)
self.textbox.mark_set("matchEnd", "%s+%sc" % (index, count.get()))
self.textbox.tag_add(tag,"matchStart","matchEnd")
#Futile attempt to remove the ** from the headings
#text = self.textbox.get("matchStart", "matchEnd")
#orig_length = len(text)
#text = text.replace("*","").ljust(orig_length, " ")
#self.textbox.delete("matchStart", "matchEnd")
#self.textbox.insert("matchStart", text)
if __name__ == '__main__':
text = """*Heading 1*
A paragraph
**Heading 2**
Some more text
***Heading 3***
Conclusion
"""
root = tk.Tk()
root.withdraw()
HelpDialog(root,text)
Ваша закомментированная попытка пытается заменить текст ничем. Почему бы просто не удалить текст?
@BryanOakley Я изменил вопрос, чтобы сузить рамки. Закомментированный код заменяет * на <пустую строку>, я открыт для лучших способов удалить/скрыть их.
@BryanOakley Я изо всех сил пытаюсь выбрать начальную и конечную точки для удаления. Должен ли я выполнять еще один поиск между текущими метками «matchStart», «matchEnd» для * и использовать результат этого? Кажется, перебор.






Короткий ответ заключается в том, что вы можете использовать метод текстового виджета delete для удаления символов в начале и конце диапазона. Вы можете выполнить упрощенную математику для индексов, чтобы настроить их. Так, например, чтобы удалить символ в «matchEnd» (который на самом деле представляет собой место, просто после — последний символ в совпавшем диапазоне), вы можете сделать delete("matchEnd-1c"), где -1c — это сокращение от «минус один символ».
В каждом конце вашего цикла внутри tag_match добавьте следующие две строки:
self.textbox.delete("matchStart")
self.textbox.delete("matchEnd-1c")
Однако этот код предполагает, что разметка состоит всего из одного байта. Вам нужно будет передать информацию, чтобы сообщить функции, сколько символов с каждой стороны текста нужно удалить, поскольку в противном случае эта информация не существует.
Например, вы можете передать его следующим образом:
self.tag_match(r"^[\*]{1}[\w\d -]+[\*]{1}$", "h1", 1)
Затем вам нужно будет настроить код, который удаляет символы, чтобы учесть эту информацию. Например, если вы передадите это число как переменную n, это будет выглядеть примерно так:
def tag_match(self, regex, tag, n):
...
while True:
...
self.textbox.delete("matchEnd-{}c".format(n), "matchEnd")
self.textbox.delete("matchStart", "matchStart+{}c".format(n))
Вы хотите буквально удалить их или просто скрыть от глаз? Я думаю, что «Может ли кто-нибудь помочь мне с алгоритмом анализа, стиля и переформатирования заголовков уценки?» слишком широкий вопрос для переполнения стека.