首页 > 解决方案 > python匹配变量组

问题描述

我的目标是将下面的代码从 A 函数重新格式化为 B 函数,这意味着使用 Log.d 代码语句替换 StringBuilder 语句。

public void A() {
    int i = 0;
    StringBuilder sb = new StringBuilder();
    sb.append("i Counter:");
    sb.append(i);
    Log.d(TAG, sb.toString());
    int j = 0;
    StringBuilder sb1 = new StringBuilder();
    sb1.append("i Counter:");
    sb1.append(i);
    sb1.append(" j Counter:");
    sb1.append(j);
    Log.d(TAG, sb1.toString());
}

public void B() {
    int i = 0;
    Log.d(TAG, "i Counter" + i);
    int j = 0;
    Log.d(TAG, "i Counter" + i + " j Counter" + j);
}

我正在考虑使用正则表达式来匹配 append() 调用中的内容。但是附加行是未知的,它可能在 1 到 N 的范围内。

python 正则表达式是解决这个问题的好工具吗?

如果没有,最好的语言是什么?

标签: python

解决方案


您可以使用re.sub替换函数,该函数将append调用中的所有字符串与+

import re
def build(m):
    return ''.join((m.group(3), ' + '.join(re.findall(r'%s\.append\((.*)\);' % m.group(1), re.sub(r'^(?!\s+%s\.append\b).*' % m.group(1), '', m.group(2), flags=re.MULTILINE | re.DOTALL))), ');'))
print(re.sub(r'StringBuilder (\w+) = new StringBuilder\(\);(.*?)(Log.d\(\w+, )\1\.toString\(\)\);', build, s, flags=re.DOTALL))

所以给出:

s = '''public void A() {
    int i = 0;
    StringBuilder sb = new StringBuilder();
    sb.append("i Counter:");
    sb.append(i);
    Log.d(TAG, sb.toString());
    int j = 0;
    StringBuilder sb1 = new StringBuilder();
    sb1.append("i Counter:");
    sb1.append(i);
    sb1.append(" j Counter:");
    sb1.append(j);
    // no matching below
    sb1.append(x);
    Log.d(TAG, sb1.toString());
}'''

这输出:

public void A() {
    int i = 0;
    Log.d(TAG, "i Counter:" + i);
    int j = 0;
    Log.d(TAG, "i Counter:" + i + " j Counter:" + j);
}

推荐阅读