2016-08-31 2 views
-1

Я написал сценарий в Python для пользовательской HTML-страницы, которая находит слово в строке/строке и выделяет именно это слово с использованием следующих тегов, где экземпляр - это слово, которое искали.Python - вставлять теги html в строки на основе соответствия регулярных выражений

<b><font color=\"red\">"+instance+"</font></b> 

следующий результат: enter image description here

Мне нужно найти слово (чувствительно к регистру), скажем, «порт» в строке, которая может быть порт, порт, поддержка, поддержка и т.д., что достаточно просто.

pattern = re.compile(word, re.IGNORECASE) 
find_all_instances = pattern.findall(string_to_search) 

Однако мои строки часто содержат 2 или более экземпляров в одной строке, и мне нужно добавить <b><font color=\"red\">"+instance+"</font></b> к каждому из этих случаев, не меняя случаев.

Проблема с моим подходом заключается в том, что я пытаюсь повторить все экземпляры, найденные с помощью findall (точное совпадение), , в то время как в одной строке также можно найти несколько одинаковых совпадений.

for instance in find_all_instances: 
    second_pattern = re.compile(instance) 
    string_to_search = second_pattern.sub("<b><font color=\"red\">"+instance+"</font></b>", string_to_search) 

Это приводит следующее:

<b><font color="red"><b><font color="red"><b><font color="red">Http</font></b></font></b></font></b></font> 

, когда мне нужно

<b><font color="red">Http</font></b> 

Я думал, я мог бы избежать этого, если бы я был в состоянии узнать точную часть строка, которую pattern.sub заменяет в момент ее выполнения, , однако я не смог найти примеров такого использования, что заставляет меня думать, что я делаю что-то очень неправильное ,

Если у кого есть способ, я могу использовать для вставки <b><font color="red">instance</font></b> без замены instance для всех совпадений (без учета регистра), то я был бы признателен.

ответ

0

Возможно, я неверно истолковал ваш вопрос, но не стал бы лучшим вариантом?

Пример: https://repl.it/DExs

+0

спасибо. Это работает так, как ожидалось. – iluzek

0

Хорошо, так два пути, которые я сделал быстро! Второй цикл - это, безусловно, путь. Он использует re.sub (как кто-то еще комментировал). Он заменяет нижний регистр поиска.

import re 

FILE = open("testing.txt","r") 
word="port" 

#THIS LOOP IS CASE SENSITIVE 
for line in FILE: 
    newline=line.replace(word,"<b><font color=\"red\">"+word+"</font></b>") 
    print newline 

#THIS LOOP IS INCASESENSITIVE 
for line in FILE: 
    pattern=re.compile(word,re.IGNORECASE) 
    newline = pattern.sub("<b><font color=\"red\">"+word+"</font></b>",line) 
    print newline 
Смежные вопросы