我正在用python构建一个C++
代码生成器。我有一个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 = tmp_0_1
coeff = p1
然后,假设我已经使用变量和系数生成了一个新代码(字符串),那么我必须替换该字符串,而不是在该特定行中使用给定的模式。
例如,在包含<<** tmp_0_1_lift_step_to_add_p1 **>>
的行中,我应该放一个新的字符串,让我们暂时说一下简单的tmp_0_1 + p1
(实际上,新字符串更复杂)。
因此,无论我在何处使用<<** VARIABLE_lift_step_to_add_COEFFICIENT **>>
这样的模式,都应将新字符串放入具有不同变量和系数名称的位置。在我提供的示例中,它应该出现6次。
任何想法该怎么做?我猜想它必须使用re
模块对python中的正则表达式进行某些处理,但到目前为止,我仍无法弄清楚如何解决此问题。
代码在python中。
谢谢!
答案 0 :(得分:0)
您可以将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
}