如何将相同的捕获组替换为多次,不确定的次数?

时间:2016-09-22 19:14:54

标签: regex

对不起标题,但我无法找到更好的词组方式。我所拥有的是一个看起来像这样的结构(每个缩进组的大小都是artbitrary,就像它们之间的填充大小一样):

q
111:
    a
    b
    c
w
e
222:
    d
    e
    f
    g
r

我想将其转换为如下所示:

q
111: a
111: b
111: c
w
e
222: d
222: e
222: f
222: g
r

我目前正在做的是:1)搜索每个缩进组的最后一个标签,并将其替换为'标题&#39 ;; 2)在最大缩进组中每个项目重复整个过程一次; 3)手动删除标题。不用说,这感觉非常像黑客。这是我第一步使用的正则表达式:^([^\n]*:)(.*?)\t(?![^\n]*?\n\t) → \1\2\1[ ] 我真正喜欢的是立刻替换每个缩进组中的所有选项卡,但我找不到任何方法来执行此操作。我使用的是Python(或者更确切地说是使用此库的Sublime Text正则表达式插件)。

2 个答案:

答案 0 :(得分:2)

我不确定正则表达式是否是此处使用的最佳工具。我会使用更尖锐的文本处理工具,如awk

{
  if (match($0, /^[0-9]+:$/)) {
    num = $1;
  }
  else if(match($0, /^[ ]+[a-z]$/)) {
    print num, $NF;
  }
  else {
    print $0;
  }
}

您可以像这样运行:

$ awk -f /tmp/script.awk </tmp/file.ext

输出:

q
111: a
111: b
111: c
w
e
222: d
222: e
222: f
222: g
r

script.awk是上述代码段,file.ext是您需要处理的文件。

答案 1 :(得分:0)

如果您正在使用Python,那么另一种方法就是循环遍历这些行并构建您的结果:

import re

res = []
key = ''
for s in input.splitlines():
    if s.endswith(':'):
        key = s
    else:
        res.append(re.sub('^\\t', key, s))
res = '\n'.join(res)

print(res)