Извлеките часть строки, затем проанализируйте ее и измените на новый текст - PullRequest
0 голосов
/ 22 июня 2019

Я строю генератор кода C++ на python.У меня есть шаблонный файл C++, который выглядит следующим образом (это только часть файла шаблона, но остальное почти такое же):

/* Pass 1: Process columns one by one */
for (int j = 0; j < uiTrSize; j++)
{
    /* butterfly_0 - permutation to even and od parts */
    tmp_0_0 = block[j * uiStride + 0] + block[j * uiStride + 3];
    tmp_0_3 = block[j * uiStride + 0] - block[j * uiStride + 3];
    tmp_0_1 = block[j * uiStride + 1] + block[j * uiStride + 2];
    tmp_0_2 = block[j * uiStride + 1] - block[j * uiStride + 2];

    /* lifting_step_0 */
    // this is A2; pi/4
    tmp = tmp_0_0 + (<< **tmp_0_1_lift_step_to_add_p1 ** >>);                                  // add lift by p1
    coeff[j * uiTrSize + 2] = (<< **tmp_lift_step_to_add_u1 ** >>) - tmp_0_1;                  // add lift by u1
    coeff[j * uiTrSize + 0] = tmp - (<< **coeff[j * uiTrSize + 2] _lift_step_to_add_b1 ** >>); // add lift by b1

    // 3pi/8
    tmp = tmp_0_2 + (<< **tmp_0_3_lift_step_to_add_p2 ** >>);                                  // add lift by p2
    coeff[j * uiTrSize + 3] = tmp_0_3 - (<< **tmp_lift_step_to_add_u2 ** >>);                  // add lift by u2
    coeff[j * uiTrSize + 1] = tmp + (<< **coeff[j * uiTrSize + 3] _lift_step_to_add_b2 ** >>); // add lift by b2
}

Мне нужно найти строки с шаблоном<<** VARIABLE_lift_step_to_add_COEFFICIENT **>>, чем найти, какой VARIABLE и какой COEFFICIENT применяются для этой строки.Обратите внимание, что VARIABLE и COEFFICIENT - это разные имена в каждой строке, и я должен извлечь их точные имена.
Это будет использоваться для генерации нового кода.Это первая часть, чтобы найти эту часть строки.В конце я должен получить что-то вроде:

variable = tmp_0_1
coeff = p1

Чем предположим, что я сгенерировал новый код (строку), используя переменную и коэффициент, я должен заменить эту строку вместо данного шаблона в этой конкретной строке,Например, в строке, содержащей <<** tmp_0_1_lift_step_to_add_p1 **>>, я должен поместить новую строку, скажем, пока просто: tmp_0_1 + p1 (на практике новая строка более сложная).

Итак, где бы я ни имел образецкак это <<** VARIABLE_lift_step_to_add_COEFFICIENT **>>, я должен поместить новую строку с другим именем переменной и коэффициента.В приведенном мной примере это должно происходить 6 раз.

Есть идеи, как это сделать?Я предполагаю, что это связано с регулярными выражениями в python с использованием модуля re, но до сих пор я не смог понять, как решить эту проблему.

Код написан на python.

Спасибо!

1 Ответ

0 голосов
/ 22 июня 2019

Вы можете использовать re.sub() с обратными ссылками на группы поиска, например, \1, \2:

data = '''/* Pass 1: Process columns one by one */
  for (int j = 0; j < uiTrSize; j++)
  {
    /* butterfly_0 - permutation to even and od parts */
    tmp_0_0 = block[j*uiStride + 0] + block[j*uiStride + 3];
    tmp_0_3 = block[j*uiStride + 0] - block[j*uiStride + 3];
    tmp_0_1 = block[j*uiStride + 1] + block[j*uiStride + 2];
    tmp_0_2 = block[j*uiStride + 1] - block[j*uiStride + 2];

    /* lifting_step_0 */
    // this is A2; pi/4
    tmp = tmp_0_0 + (<<** tmp_0_1_lift_step_to_add_p1 **>>); // add lift by p1
    coeff[j*uiTrSize + 2] = (<<** tmp_lift_step_to_add_u1 **>>) - tmp_0_1; // add lift by u1
    coeff[j*uiTrSize + 0] = tmp - (<<** coeff[j*uiTrSize + 2]_lift_step_to_add_b1 **>>); // add lift by b1

    // 3pi/8
    tmp = tmp_0_2 + (<<** tmp_0_3_lift_step_to_add_p2 **>>); // add lift by p2
    coeff[j*uiTrSize + 3] = tmp_0_3 - (<<** tmp_lift_step_to_add_u2 **>>); // add lift by u2
    coeff[j*uiTrSize + 1] = tmp + (<<** coeff[j*uiTrSize + 3]_lift_step_to_add_b2 **>>); // add lift by b2
 }'''

import re

s = re.sub(r'<<\*\*\s*(.*?)_lift_step_to_add_(.*?)\s*\*\*>>', r'\1+\2', data)

print(s)

Печать:

/* Pass 1: Process columns one by one */
  for (int j = 0; j < uiTrSize; j++)
  {
    /* butterfly_0 - permutation to even and od parts */
    tmp_0_0 = block[j*uiStride + 0] + block[j*uiStride + 3];
    tmp_0_3 = block[j*uiStride + 0] - block[j*uiStride + 3];
    tmp_0_1 = block[j*uiStride + 1] + block[j*uiStride + 2];
    tmp_0_2 = block[j*uiStride + 1] - block[j*uiStride + 2];

    /* lifting_step_0 */
    // this is A2; pi/4
    tmp = tmp_0_0 + (tmp_0_1+p1); // add lift by p1
    coeff[j*uiTrSize + 2] = (tmp+u1) - tmp_0_1; // add lift by u1
    coeff[j*uiTrSize + 0] = tmp - (coeff[j*uiTrSize + 2]+b1); // add lift by b1

    // 3pi/8
    tmp = tmp_0_2 + (tmp_0_3+p2); // add lift by p2
    coeff[j*uiTrSize + 3] = tmp_0_3 - (tmp+u2); // add lift by u2
    coeff[j*uiTrSize + 1] = tmp + (coeff[j*uiTrSize + 3]+b2); // add lift by b2
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...