2015-05-23 5 views
-1

У меня есть следующий код.Python string.replace не заменяет

def render_markdown(markdown): 
     "Replaces markdown links with plain text" 
     # non greedy 
     # also includes images 
     RE_ANCHOR = re.compile(r"\[[^\[]*?\]\(.+?\)") 
     # create a mapping 
     mapping = load_mapping() 
     anchors = RE_ANCHOR.findall(markdown) 
     counter = -1 
     while len(anchors) != 0: 
      for link in anchors: 
       counter += 1 
       text, href = link.split('](')[:2] 
       text = '-=-' + text[1:] + '-=-' 
       text = text.replace(' ', '_') + '_' + str(counter) 
       href = href[: -1] 
       mapping[text] = href 
       markdown = markdown.replace(link, text) 
       anchors = RE_ANCHOR.findall(markdown) 
     return markdown, mapping 

Однако функция уценки не заменяет все ссылки. Почти никто не заменен. Я посмотрел на SO и нашел много вопросов, относящихся к этому. Проблемы найдены были типа:

abc.replace(x, y) instead of abc = abc.replace(x, y) 

Я делаю это, но строка не заменяются

+0

Можете ли вы привести пример того, что вы ожидаете? – kindall

+1

Почему вы не используете [многие библиотеки разметки] (https://pypi.python.org/pypi?%3Aaction=search&term=markdown&submit=search), доступные для установки, готовые к работе? –

+0

@kindall Это попытка научить себя. Поэтому я строю с нуля. Я ожидаю, что [поиск] (https://google.com) будет заменен на - = - search - = - – theSage

ответ

1

Похоже, причина в том, что ваше регулярное выражение не соответствует тексту, который вы ожидали. Итак, цикл пуст.

Попробуйте разместить некоторые примеры уценки, запустить свой код и добавить Распечатайте заявления, так что вы можете увидеть все промежуточные результаты (особенно якоря список). С этим в руке отладка будет намного проще :-)

+0

Я проверил с добавлением операторов печати по всей функции. Каждая ссылка находится в реестре, как ожидалось. Однако возвращаемое значение функции замены является таким же, как и исходное. Это непротиворечиво. Иногда он заменяет, иногда это не так. Есть идеи? – theSage

+4

Если вы не разместите свои данные об образцах и ожидаемый результат, трудно дать вам значимую помощь. Обычная причина, по которой '' replace (old, new) '' ничего не заменяет, заключается в том, что нет точного соответствия для * old *. –

0

Я не понимаю, почему вы используете replace, когда вы уже используете регулярное выражение. Библиотека re предоставляет вам инструменты для работы с вами, не требуя поиска строки дважды (один раз с регулярным выражением и один раз с replace).

Например, MatchObject содержит start and end позиции совпадающего текста. Вы можете использовать нарезку текста для выполнения собственных подстановок. Но даже это необязательно, так как вы можете использовать re.sub и иметь библиотеку re, если вы найдете совпадение. Вам просто нужно определить вызываемый, который принимает MathObject и возвращает текст для его замены.

def render_markdown(markdown): 
    "Replaces markdown links with plain text" 

    RE_ANCHOR = re.compile(r"\[[^\[]*?\]\(.+?\)") 

    mapping = load_mapping() 

    def replace_link(m): 
     # process your link here... 
     mapping[text] = href 
     return text 

    return RE_ANCHOR.sub(replace_link, markdown) 

И если вы хотите, чтобы сделать несколько дополнений регулярного выражения, вы могли бы иметь регулярное выражение разбить ссылку на часть, которые были бы доступны в виде групп на объекте матча. Например:

RE_ANCHOR = re.compile(r"\[([^\[]*?)\]\((.+?)\)") 

# ... 

text = m.group(1) 
link = m.group(2) 

Все, что я сделал добавить набор скобки вокруг каждого из текста и ссылки (внутри скобок). Хотя, я ожидаю, что ваше регулярное выражение недостаточно сложное, чтобы соответствовать всем возможным ссылкам, найденным в документах Markdown. Например, библиотека Python-Markdown допускает, по меньшей мере, шесть уровней вложенных скобок внутри «текстовой» части ссылки. И не забывайте о названиях, определенных в ссылке (как (url "title")). Но это просто царапает поверхность. Кроме того, это будет отдельный вопрос.

+0

Спасибо. Вы правы относительно вложенных скобок. Я доберусь до них в конце концов. На данный момент я изменил код, чтобы использовать описанный вами способ. Однако я до сих пор не понимаю, почему замена не происходила.Если в моем коде не было недостатков, логика была довольно ясной и недвусмысленной. Единственная ошибка заключалась в том, что она не была эффективной. Спасибо за помощь в любом случае. : D – theSage

Смежные вопросы