Python: каждый раз, когда происходит" очистить", я хочу, чтобы текст был связан со списком


Я пытаюсь связать мой тестовый фрейм с моим файлом журнала, чтобы выяснить, какие экземпляры проходят, а какие нет. Чтобы объяснить лучше, вот пример : У меня есть список:

data = ['F','P'] # first test pass, second test fail 

А вот мой лог-файл:

USER INPUT :  “clear”                   ------
SYSTEM RESPONSE: “Hello! How are you?”        | Fail
USER INPUT : “Good thank you”                 |
SYSTEM RESPONSE: "Okay"                 ------ 
USER INPUT : “clear”                    ------
SYSTEM RESPONSE: “Hello! How are you?”        |
USER INPUT : “I am good, Thank you!”          | Pass
SYSTEM RESPONSE: "Great!"                     | 
USER INPUT : “Good”                     ------

Таким образом, каждый экземпляр "clear" показывает новый журнал, поэтому я хочу, чтобы первый "clear" до следующего clear был связан с P, я использую html для построения кода, и всякий раз, когда P происходит, он будет зеленым цветом и каждый раз, когда F происходит, код с be красный

Пока что у меня есть:

            for line in lines :
                for i in cc:
                    if (data[i]== 'P'):
                        n = """<p style="color:green;>""" + line + '</p>'
                    else:
                        n = """<p style="color:red;>""" + line + '</p>'

Я действительно не уверен в структуре. как найти каждый раз, когда происходит" clear " и присвоить ему определенный цвет, пока не произойдет следующий экземпляр. Пожалуйста, не стесняйтесь задавать мне любые вопросы по этому поводу или уточнять! Огромное спасибо!

2   2   2018-07-30 21:29:19

2 ответа:

Вы можете использовать re для разделения файла журнала в соответствии с USER INPUT : "clear":

log_file = """USER INPUT :  “clear”
SYSTEM RESPONSE: “Hello! How are you?”
USER INPUT : “Good thank you”
SYSTEM RESPONSE: "Okay"
USER INPUT : “clear”
SYSTEM RESPONSE: “Hello! How are you?”
USER INPUT : “I am good, Thank you!”
SYSTEM RESPONSE: "Great!"
USER INPUT : “Good”"""

import re
from pprint import pprint

groups = re.findall(r'USER INPUT.*?clear.*?(?:(?=USER INPUT :\s+\Wclear\W)|(?=\Z))', log_file, flags=re.DOTALL)
data = ['F','P']

style = {'P': '<p style="color:green;>', 'F': '<p style="color:red;>'}

html = ''
for d, g in zip(data, groups):
    for line in g.splitlines():
        html += style[d] + line + '</p>\n'

pprint(html)

Это печатает:

('<p style="color:red;>USER INPUT :  “clear”</p>\n'
 '<p style="color:red;>SYSTEM RESPONSE: “Hello! How are you?”</p>\n'
 '<p style="color:red;>USER INPUT : “Good thank you”</p>\n'
 '<p style="color:red;>SYSTEM RESPONSE: "Okay"</p>\n'
 '<p style="color:green;>USER INPUT : “clear”</p>\n'
 '<p style="color:green;>SYSTEM RESPONSE: “Hello! How are you?”</p>\n'
 '<p style="color:green;>USER INPUT : “I am good, Thank you!”</p>\n'
 '<p style="color:green;>SYSTEM RESPONSE: "Great!"</p>\n'
 '<p style="color:green;>USER INPUT : “Good”</p>\n')

Правка:

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

Самый быстрый и грязный способ-прочитать весь текст сразу и разбить его на USER INPUT : "clear".

# skip the first line since it's a clear, but not a separator
text = "\n".join(lines[1:])
split_on = 'USER INPUT :  "clear"                   ------\n'
blocks = text.split(split_on)
html_lines = []
for pf, block in zip(data, blocks):
    html_lines.append("<pre style='color:{};'>{}</pre>".format("green" if pf == "P" else "red", split_on + block))

with open("out.html", "w+") as outfile:
    outfile.writelines(html_lines)