В настоящее время у меня есть основной текст как таковой

text = "hello this [is a cool] line of text that might have [two] brackets.

Мне нужно проанализировать и заменить этот текст, поэтому в этом примере он будет выглядеть как

text = "hello this <a href='/phrase/is a cool/'>is a cool</a> line of text that might have <a href='/phrase/two/'>two</a> brackets.

Теперь я думаю, что в регулярном выражении все скобки есть \[.*?\], но я не уверен, как это сделать конкретно.

0
nadermx 9 Окт 2021 в 23:57

2 ответа

Лучший ответ

Сделать это можно так:

import re

text = "hello this [is a cool] line of text that might have [two] brackets."

brackets = re.compile(r'\[(.*?)\]')
new_text = brackets.sub(lambda x: f'<a href=/phrases/{x.group(1)}>{x.group(1)}</a>', text)

print(new_text)

Это заменит шаблон тем, что возвращает лямбда:
x.group(1) возвращает первую группу в шаблоне регулярного выражения (индексирование начинается с 1): (.*?), что означает, что он вернет только текст между скобками, а затем отформатирует его с помощью f strings.

Чтобы также удалить любые знаки препинания из текста в скобках, можно использовать этот код (обратите внимание, что в конечном результате нет ни одного из ., которые были между скобками):

import re
import string

text = "hello this [is a..... cool] line of text that might have [two] brackets."


def replace_with_link(match):
    info = match.group(1)
    info = info.translate(str.maketrans('', '', string.punctuation))
    return f'<a href="/phrases/{info}">{info}</a>'


brackets = re.compile(r'\[(.*?)\]')
new_text = brackets.sub(replace_with_link, text)

print(new_text)
1
Matiiss 9 Окт 2021 в 21:43

Вы можете сделать это, следуя

  1. Получить все подстроки, заключенные в [ и ]
  2. Замените содержимое соответствующим текстом
>>> import re
>>> txt = "hello this [is a cool] line of text that might have [two] brackets."
>>> phrases = re.findall(r"(\[.+?\])", txt)
>>> for phrase in phrases:
...     txt = txt.replace(phrase, "<a href='/phrase/{}/'>{}</a>".format(phrase[1:-1], phrase[1:-1]))
... 
>>> txt
"hello this <a href='/phrase/is a cool/'>is a cool</a> line of text that might have <a href='/phrase/two/'>two</a> brackets."
>>> 
1
tbhaxor 9 Окт 2021 в 21:19