Найти - Пользователи
Полная версия: Как заменить **одинаковые тэги** {b}разными символами{/b}?
Начало » Python для новичков » Как заменить **одинаковые тэги** {b}разными символами{/b}?
1
Schlange
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 я хз.
doza_and
Начать надо с исчерпывающего описания задачи. То что у вас недостаточно.
как вы предполагаете преобразовывать примеры снизу? Валиден любой входной поток или возможны синтаксические ошибки? Как вы планируете добиваться вывода двойных звездочек?
 "aaa**bbb"
" aaa**bbb__ccc**ddd"
"aaa ** bbb** ccc"
А так читайте книги, например теория синтаксического анализа перевода и компиляции. Теорию конечных автоматов.

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

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

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

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

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

Про это не слышал, что-то есть на русском?
doza_and
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>

Djokovich
Спасибо парни за ценные советы, давноискал эту информацию!
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