2017-01-11 26 views
0

我有一些问题想到一个好的算法来替换文本中的某些实体。这里是详细信息: 我有一个文本,我需要格式化为HTML格式的信息是在一个包含实体的字典的Python列表。比方说,例如,原来的文字是这样的(请注意格式):通过索引替换多个字符串的算法

Lorem存有简直是printing和排版行业的虚拟文本。

我会得到的文本将是(不带格式):

Lorem存有简直是印刷排版行业的虚拟文本。

像这样实体的名单:

entities = [{"entity_text":"Lorem Ipsum", "type": "bold", "offset": 0, "length":"11"}, {"entity_text":"dummy", "type": "italic", "offset": 22, "length":"5"},{"entity_text":"printing", "type": "text_link", "offset": 41, "length":"8", "url": "google.com"}] 

我的算法应把这个给定的无格式文本和实体到这个网站:使之能

<b>Lorem Ipsum</b> is simply <i>dummy</i> text of the <a href="google.com">printing</a> and typesetting industry

被编译成原始信息。 我试过字符串替换,但它弥补了偏移量(实体从文本开始的位置)。请记住,在文本中可能会有很多格式化的单词,这些单词没有格式化,所以我必须准确找到应格式化的单词。任何人的帮助?我正在用Python编写代码,但你可以指定任何语言的算法

编辑 对不起,我忘了发布我试过的代码。这是它:

format_html(text, entities): 
    for entity in entities: 
     try: 
      entity_text = entity['entity_text'] 
      position = text.find(entity_text, entity['offset']) 
      if position == entity['offset']: 
       before = text[:position] 
       after = text[min(position+entity['length'], len(text)-1):] 
       if entity['type'] == 'text_link': 
        text_link = '<a href="{}">{}</a>'.format(entity['url'], entity_text) 
        text = before + text_link + after 
       elif entity['type'] == 'code': 
        code = '<code>{}</code>'.format(entity_text) 
        text = before + code + after 
       elif entity['type'] == 'bold': 
        bold_text = '<b>{}</b>'.format(entity_text) 
        text = before + bold_text + after 
       elif entity['type'] == 'italic': 
        italic_text = '<i>{}</i>'.format(entity_text) 
        text = before + italic_text + after 
       elif entity['type'] == 'pre': 
        pre_code = '<pre>{}</pre>'.format(entity_text) 
        text = before + pre_code + after 
     except: 
      pass 
+0

什么算法有*你*尝试的唯一选择?请在这里发布代码。 – blacksite

+0

@not_a_robot,请查看编辑 – Ken

+0

get_message和parse_entity是什么样的?你能否包括那个类和所有相关的代码? *你*可能熟悉你的课程,但我们不是! – blacksite

回答

0

好了,这是我如何解决它。每次修改文本时,我都会调整偏移量,并在文本中添加额外字符串(由于标记)的长度。这是在计算时间方面是昂贵的,但是这是我见过的

def format_html(text, entities): 
    for entity in entities: 
     try: 
      modified = None 
      entity_text = entity['entity_text'] 
      position = text.find(entity_text, entity['offset']) 
      if position == entity['offset']: 
       before = text[:position] 
       after = text[min(position+entity['length'], len(text)-1):] 
       if entity['type'] == 'text_link': 
        text_link = '<a href="{}">{}</a>'.format(entity['url'], entity_text) 
        text = before + text_link + after 
        modified = 15 + len(entity['url']) 
       elif entity['type'] == 'code': 
        code = '<code>{}</code>'.format(entity_text) 
        text = before + code + after 
        modified = 13 
       elif entity['type'] == 'bold': 
        bold_text = '<b>{}</b>'.format(entity_text) 
        text = before + bold_text + after 
        modified = 7 
       elif entity['type'] == 'italic': 
        italic_text = '<i>{}</i>'.format(entity_text) 
        text = before + italic_text + after 
        modified = 7 
       elif entity['type'] == 'pre': 
        pre_code = '<pre>{}</pre>'.format(entity_text) 
        text = before + pre_code + after 
        modified = 11 
       if modified: 
        for other in entites: 
         if other['offset'] > entity.offset: 
          other.offset += modified 
     except: 
      pass 
+0

当这些代码有不同类型的重复时,这些代码是否工作正常相同的*词*粗体和相同的**词**斜体?以及什么时候偏移量没有排序? – RobinHood

+0

是的,我没有真正关注一个单词有2个或更多的格式,我想这个算法不会那样工作。至于偏移量的顺序,这并不重要,因为我们只偏移大于当前实体偏移量的偏移量。检查线'if other ['offset']> entity.offset:' – Ken

+0

更新偏移后验是一个好主意,但比问题需求更复杂。另外,如果你用len()函数控制修改,并且在每种情况下将specific_text作为特定部分的代码,则可以创建更简单的代码,并执行通用的'text = before + specific_text +。 – RobinHood

1

你可能是这样的意思?

text = "" 
for entry in entries: 
    line = "" 
    for key, value in entry.iteritems(): 
     if key == 'entity_text': 
      line += value 
     elif key == 'type' and value == 'bold': 
      line = "<b> {} </b>".format(line) 
     elif key == 'type' and value == 'italic': 
      line = "<i> {} </i>".format(line) 
     elif key == 'type' and value == 'text_link': 
      line = '<a href="google.com">{}</a>'.format(line) 
    text += line 
text 

转化为

'<b> Lorem Ipsum </b><i> dummy </i><a href="google.com">printing</a>' 
+0

对不起,我认为我错了没有发布整个方法。 “文本”实际上是给出的文本,简单的文本。你必须在变量'text'中找到要格式化的单词。在这种情况下,“文本”是“Lorem Ipsum仅仅是印刷和排版行业的虚拟文本”。问题是,你如何知道文本中的位置来添加它们。正如你所看到的,你的结果给出了与我看到的原始 – Ken

+0

不同的文本,我想这实际上取决于你开始使用的数据,但对我而言仍然不清楚。这是一个网站的代码,或文件内容.. – Daniel

+0

这不是一个网站,我真的不知道如何在这里需要信息。我给了一个字符串(未格式化)和一个变量'entities',其中包含哪些词在哪些位置需要以何种方式进行格式化(如我在问题中给出的例子)。我只需要提供给 – Ken