正则表达式递归和多次替换

时间:2018-08-06 04:48:51

标签: python regex

我在使用正则表达式时遇到了挑战,可以使用一些帮助。当前正在使用脚本来通过使用正则表达式来更新插件的源文件上的语法。

情况:

在没有循环进行正则表达式搜索直到没有匹配之前,我试图将多个变量声明为int函数,因为旧语法不需要它。

例如,这是旧代码,然后是我希望它变成的
void Split(const char[] variable, test1, char[] variable2, test2, test3) {

void Split(const char[] variable, int test1, char[] variable2, int test2, int test3) {

我有一个正则表达式来匹配它的单个实例:
(^\w.*?)(\(|, )([\w_\&]+)(, |\))
然后可以替换为:
\1\2int \3\4

2 个答案:

答案 0 :(得分:0)

我决定只创建一个循环

编辑:

    m = re.search(r"((?:^|\n)\w.*?(?:,\s*|\())(\w+(?:,\s*|\)))", code, re.M)
    while m:
        code = re.sub(r"((?:^|\n)\w.*?(?:,\s*|\())(\w+(?:,\s*|\)))", r"\1int \2", code, re.M)
        m = re.match(r"((?:^|\n)\w.*?(?:,\s*|\())(\w+(?:,\s*|\)))", code, re.M)

答案 1 :(得分:0)

您可以将函数传递给re.sub

import re
def update(d) -> str:
  return f' int{d.group()}' if len(re.findall('\w+', d.group())) == 1 else d.group()

s = 'void Split(const char[] variable, test1, char[] variable2, test2, test3)'
new_s = re.sub('(?<=[,\(\)]).*?(?=[,\(\)])', update, s)

输出:

'void Split(const char[] variable, int test1, char[] variable2, int test2, int test3)'