Разобрать неструктурированный текст по словарным терминам, чтобы включить ссылку на термин - PullRequest
2 голосов
/ 20 октября 2011

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

Я бы предположил, что приложение должно состоять из пользовательского тега шаблона, который анализирует object.text, который использует что-то вроде парсера регулярного выражения для сопоставления любых thing.slug терминов из словаря всех 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, хотя я не настолько знаком с ним.

Ответы [ 2 ]

1 голос
/ 20 октября 2011

Модуль 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>'
1 голос
/ 20 октября 2011
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+' ')
...