Python: найти строки внутри динамического c текста и поместить другой текст перед строкой - PullRequest
0 голосов
/ 17 июня 2020

Я пытался найти / построить решение, но на данный момент это слишком сложно для меня. У меня есть текст из SAP (хранящийся в scrooledtext tkinter.

session.findById("wnd[0]").sendVKey 4
session.findById("wnd[1]/tbar[0]/btn[17]").press
session.findById("wnd[1]/usr/tabsG_SELONETABSTRIP/tabpTAB001/ssubSUBSCR_PRESEL:SAPLSDH4:0220/sub:SAPLSDH4:0220/ctxtG_SELFLD_TAB-LOW[3,24]").setFocus
session.findById("wnd[1]").sendVKey 0
session.findById("wnd[1]/usr/lbl[1,1]").setFocus
session.findById("wnd[1]").sendVKey 33

Я хотел бы найти каждую строку, когда возникает .sendVKey, и поместить новый текст в начале строки (или над строкой) - например, в пример состоит из 3 строк:

Добавлен новый текст до появления текста sendkey! session.findById ("wnd [0]"). sendVKey 4

(...) Добавлен новый текст перед sendkey появляется текст! <\ b> session.findById ("wnd [1]"). sendVKey 0

(...)

Пробовал использовать re.sub, re.findall и replace, но я думаю, что это не очень хороший подход. Мой рабочий код ниже, но это не Dynami c (в методе .sendVkey это может быть другое окно (0, 1, 2, 3 et c) в (" wnd [1] "). Есть какие-нибудь подсказки / решения? Пожалуйста, помогите: (

    def multiple_replace(string, rep_dict):
        pattern = re.compile("|".join([re.escape(k) for k in sorted(rep_dict, key=len, reverse=True)]), flags=re.DOTALL)
        return pattern.sub(lambda x: rep_dict[x.group(0)], string)


    date_div = RPAcode.get("1.0", tk.END)
    delay_vba_function = "   Added new text before sendkey text occurs"
"
    replaced_text = multiple_replace(date_div, {'.sendVKey' : '\n' + delay_vba_function + '\n' + '.sendVKey', \
                                                'session.findById("wnd[1]").sendVKey' : '\n' + delay_vba_function + '\n' + 'session.findById("wnd[1]").sendVKey', \
                                                'session.findById("wnd[2]").sendVKey' : '\n' + delay_vba_function + '\n' + 'session.findById("wnd[2]").sendVKey', \
                                                'session.findById("wnd[3]").sendVKey' : '\n' + delay_vba_function + '\n' + 'session.findById("wnd[3]").sendVKey'})
    #print(replaced_text)

    RPAcode.delete('0.0', tk.END) #Deletes previous data
    RPAcode.insert(1.0, replaced_text)

1 Ответ

0 голосов
/ 17 июня 2020

Самый простой способ проверить, находится ли подстрока в строке, - использовать in -оператор (по крайней мере, в Python3 .5). Рассмотрим следующее:

text = 'session.findById("wnd[0]").sendVKey 4'
if '.sendVKey' in text:
    text = '(...)' + text
text

Если вы запустите его в терминале, вывод будет:

'(...)session.findById("wnd[0]").sendVKey 4'

Итак, как вы можете видеть, скрипт даже добавляет уже некоторый текст перед текстовой строкой. Если вы скажете не text = '(...)' + text, а text = '(...)\n' + text, (...) появится в строке над фактическим текстом. Если вы поместите приведенный выше образец кода в for l oop, повторяя все текстовые строки, я думаю, что этот подход может решить вашу проблему.

Edit:

You сначала нужно разбить текст на строки перед повторением строк. Я думаю, это именно то, что вам нужно:

text = """session.findById("wnd[0]").sendVKey 4
session.findById("wnd[1]/tbar[0]/btn[17]").press
session.findById("wnd[1]/usr/tabsG_SELONETABSTRIP/tabpTAB001/ssubSUBSCR_PRESEL:SAPLSDH4:0220
session.findById("wnd[1]").sendVKey 0
session.findById("wnd[1]/usr/lbl[1,1]").setFocus
session.findById("wnd[1]").sendVKey 33"""

query_text = ".sendVKey"
addition = "(...) "

def indicate_lines(text, query_text, indication):
    result = ''
    text = text.splitlines()
    for line in text:
        if query_text in line:
            result = result + indication + line + "\n"
        else:
            result = result + line + "\n"
    return result

result = indicate_lines(text, query_text, addition)
print(result)

Результат будет:

(...) session.findById("wnd[0]").sendVKey 4
session.findById("wnd[1]/tbar[0]/btn[17]").press
session.findById("wnd[1]/usr/tabsG_SELONETABSTRIP/tabpTAB001
/ssubSUBSCR_PRESEL:SAPLSDH4:0220
(...) session.findById("wnd[1]").sendVKey 0
session.findById("wnd[1]/usr/lbl[1,1]").setFocus
(...) session.findById("wnd[1]").sendVKey 33

Обратите внимание, что я ожидаю, что регулярное выражение будет работать быстрее, если вы хотите иметь масштабируемый решение (потому что for -циклы сравнительно медленные в Python). Но для большинства приложений среднего размера это подойдет.

...