Разбор неструктурированного текста на предмет словарных терминов, чтобы включить ссылку на термин

#python #django #django-templates

#python #django #django-шаблоны

Вопрос:

Я работаю над проектом django, и у меня есть модель, в которой есть список things . По всему сайту у меня может быть неструктурированный текст, введенный в других моделях. При отображении страницы я хотел бы проанализировать неструктурированный текст на предмет любой ссылки thing.slug и включить ссылку на thing.get_absolute_url .

Я бы предположил, что приложение должно состоять из пользовательского тега templatetag, который анализирует object.text , который использует что-то вроде анализатора регулярных выражений для сопоставления любых thing.slug терминов из словаря all things .

Возьмем, к примеру:

У меня есть thingA и ThingB, но хотелось бы thingC.

Будет изменен на:

 I have <a href="/things/a">thingA</a> and <a href="/things/b">thingB</a>, but would like <a href="/things/c">thingC</a>.
  

Если есть приложение django, которое уже делает это, отлично! В противном случае приветствуются любые советы о том, как лучше всего это сделать. Я также поддерживаю другие предложения, такие как jquery, хотя я не так хорошо знаком с ним.

Комментарии:

1. Как происходит точное сопоставление? Вы говорите thingA , что должны быть преобразованы в /things/a , но должны thingamajiggy быть преобразованы в thing/amajiggy ? Это camelCase, так что thingThatIWant становится /things/that/i/want ?

2. Если вы знакомы с django, в моей модели есть поля для title и slug , поэтому пуля будет соответствовать urlpattern .

3. @erikankrom: это помогло бы обновить ваш вопрос, точно показывая, как thingamajiggy и thingThatIWant что следует обрабатывать. Это также помогает включить соответствующие части вашей модели в вопрос.

Ответ №1:

 urls = dict((thing.slug, thing.get_absolute_url) for thing in things)
for word in object.text.split():
  if word in urls:
     result.append('<a href="' urls[words] '">' word '</a> ')
  else
     result.append(word ' ')
  

Комментарии:

1. Мне нравится этот метод. В модели post_save я могу разобрать object.text в object.html , вероятно, через сельдерей.

Ответ №2:

Модуль re имеет функцию sub (), которая предназначена для такого поиска и замены.

Найдите шаблон, который отличает «вещи» от остального неструктурированного текста, и создайте соответствующую строку подстановки:

 >>> import re
>>> s = 'I have thing.slug and thing.foo, but would like thing.foo'
>>> re.sub(r'(w ).(w )', r'<a href="/1/2">1.2</a>', s)
'I have <a href="/thing/slug">thing.slug</a> and <a href="/thing/foo">thing.foo</a>, but would like <a href="/thing/foo">thing.foo</a>'
  

Это более надежно (менее подвержено ошибкам), если вы делаете шаблон для «вещей» более четким:

 >>> s = 'I have {thing.slug} and {thing.foo}, but would like {thing.foo}'
>>> re.sub(r'{(w ).(w )}', r'<a href="/1/2">1.2</a>', s)
'I have <a href="/thing/slug">thing.slug</a> and <a href="/thing/foo">thing.foo</a>, but would like <a href="/thing/foo">thing.foo</a>'