Как заменить несколько совпадений регулярных выражений в текстовом блоке - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь преобразовать несколько совпадений в абзаце в ссылки, сохраняя окружающий текст в моем конечном выводе.Шаблон, который я сопоставляю, напоминает синтаксис гиперссылки для Markdown как способ, позволяющий нетехническим пользователям определять, какой текст они хотели бы связать во входных данных (Google Sheet, к которому я обращаюсь через Sheets API / Python).Первая группа, которую я собираю - это связанный текст, а вторая - это значение ключа в строке запроса.

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

text = "2018 was a big year for my sourdough starter and me. Mostly 
we worked on developing this [tangy bread](19928) and these [chewy 
rolls] (9843). But we were also just content keeping each other 
company and inspired to bake."

def link_inline(text):
    # expand a proper link around recipe id
    ref = re.search(r"(\[.*?\]\(\d+\))", text, re.MULTILINE).group(1)
    if (len(ref) > 0):
        link = re.sub("\[(.*?)\]\((\d+)\)", r"<a href='https://www.foo.com/recipes?rid=\2'>\1</a>", ref)
        return text
    else:
        return "replacement failed"

Цель состоит в том, чтобы этот вывод не затрагивал абзац и просто заменял совпадения шаблона \[(.*?)\]\((\d+)\) на следующую строку, включая обратные ссылки для групп: <a href="https://www.foo.com?bar=\2">\1</a>

Таким образом, он должен будет циклически проходить по тексту, чтобы заменить все совпадения (предположительно с re.finditer?), А также сохранить исходный текст вне совпадения с образцом.Но я не уверен, как правильно определить цикл и выполнить эту замену, не перезаписывая весь абзац только моей строкой замены.

1 Ответ

0 голосов
/ 21 декабря 2018

Я использовал re.compile, и вместо круглых скобок вокруг всей группы я поместил одну пару вокруг .*?, а другую пару вокруг \d+, поскольку эти две части представляют текст, который мы хотим извлечь и поместитьв наши URL.

import re

def link_inline(text):
    # expand a proper link around recipe id
    ref = re.compile("\[(.*?)\]\((\d+)\)")
    replacer = r'<a href="https://www.foo.com/recipes?rid=\2">\1</a>'
    return ref.sub(replacer, text)


text = """
2018 was a big year for my sourdough starter and me. Mostly we worked on
 developing this [tangy bread](19928) and
 these [chewy rolls](9843). But we were also just
 content keeping each other company and inspired to bake.
"""

print(link_inline(text))

Вывод:

2018 was a big year for my sourdough starter and me. Mostly we worked on
 developing this <a href="https://www.foo.com/recipes?rid=19928">tangy bread</a> and
 these <a href="https://www.foo.com/recipes?rid=9843">chewy rolls</a>. But we were also just
 content keeping each other company and inspired to bake.

В качестве проверки работоспособности я попытался добавить некоторые дополнительные строки с круглыми скобками и скобками, которые не были ссылками, например (this) hereи [this] here в строке text.Все по-прежнему хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...