Уведомления

Группа в Telegram: @pythonsu

#1 Май 13, 2021 04:03:13

Schlange
Зарегистрирован: 2016-11-28
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

Как заменить **одинаковые тэги** {b}разными символами{/b}?

hi!
Задача - преобразование текстовой разметки в ansi коды. Но поскольку разметка — вариация markdown без открывающего и закрывающего тэгов, как в bbcodes, то столкнулся с трудностью преобразования закрывающего тэга. И с тем, чтобы не изобретать велосипед и не плодить говнокод, решил, что лучше спросить тут как это лучше сделать.

файл данных markdown.txt

 *Курсив* и _Курсив_
**Жирное начертание** и __Жирное начертание__
~~Зачеркнутый текст~~

 magenta = "\033[1;35m"
defcolr = "\033[0m"
# Открытие файла, печать содержимого на экран, и закрытие файла
with open('markdown.txt') as my_file:
    file = my_file.read().replace('**', magenta)
    print(file)

Мой пример тупо меняет все ** на magenta, а как заменить закрывающей выделенное слово тэг defcolr я хз.



ubuntu 14.04 / manjaro 16.10

Офлайн

#2 Май 13, 2021 08:26:47

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Как заменить **одинаковые тэги** {b}разными символами{/b}?

Начать надо с исчерпывающего описания задачи. То что у вас недостаточно.
как вы предполагаете преобразовывать примеры снизу? Валиден любой входной поток или возможны синтаксические ошибки? Как вы планируете добиваться вывода двойных звездочек?

 "aaa**bbb"
" aaa**bbb__ccc**ddd"
"aaa ** bbb** ccc"
А так читайте книги, например теория синтаксического анализа перевода и компиляции. Теорию конечных автоматов.

Потом выкладывайте сюда описание LL или LR или … грамматики, смотря что у вас получится.

Об инструментах

В зависимости от того как вы поставите задачу реализовать можно либо при помощи replace как у вас, либо регулярными выражениями модуль re, либо например при помощи модуля pyparsing.



Офлайн

#3 Май 13, 2021 21:59:19

Schlange
Зарегистрирован: 2016-11-28
Сообщения: 38
Репутация: +  1  -
Профиль   Отправить e-mail  

Как заменить **одинаковые тэги** {b}разными символами{/b}?

Тут любая ошибка приводит к простой печати ошибочного символа как части текста. То есть 2*2=4 так и напечатает, а 2*2=**4** выделит 4. Обрабатываются только парные тэги. Это меня и беспокоит, как после обнаружения первого * искать закрывающий. Пахнет несколькими вложенными циклами for…

C “import re” знаком, можно и их использовать.

А так читайте книги, например теория синтаксического анализа перевода и компиляции. Теорию конечных автоматов.

Про это не слышал, что-то есть на русском?



ubuntu 14.04 / manjaro 16.10

Офлайн

#4 Май 13, 2021 23:20:24

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Как заменить **одинаковые тэги** {b}разными символами{/b}?

Schlange
Про это не слышал, что-то есть на русском?
Да это есть на русском. И это первая ссылка гугла.
https://www.google.com/search?channel=fs&client=ubuntu&q=теория+синтаксического+анализа+перевода+и+компиляции
Schlange
Тут любая ошибка приводит к простой печати ошибочного символа как части текста.
??? Речь о том что ваше описание задачи даже близко не стоит с полной постановкой задачи. Указанная литература позволяет вам понять что нужно чтобы именно полностью и корректно поставить задачу преобразования текста.
Schlange
C “import re” знаком, можно и их использовать.

Я вас не понимаю. Если знаете регулярки, то колхозное решение это одна строчка…
 import re
examp="""
aaa**b_bb____ccc**ddd**ff__
2*2=**4**
"""
tmp= examp.replace("**","__")
res = re.sub("__(.*?)__",r"<b>\1</b>",tmp)
print(res)
aaa<b>b_bb</b><b>ccc</b>ddd<b>ff</b>
2*2=<b>4</b>



Офлайн

#5 Май 14, 2021 13:14:33

Djokovich
Зарегистрирован: 2021-05-14
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Как заменить **одинаковые тэги** {b}разными символами{/b}?

Спасибо парни за ценные советы, давноискал эту информацию!

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version