正则表达式 - 增量替换

1 投票
8 回答
570 浏览
提问于 2025-04-16 00:52

有没有办法只用正则表达式来进行整数的递增替换呢?

这里有个问题,我有一个文本文件,里面有 1,000,000 行,所有行的开头都是 %。

我想用正则表达式把 # 替换成递增的整数。

input:

% line one

% line two

% line three

...

output:

1 line one

2 line two

3 line three

...

8 个回答

4

虽然这个问题最好是通过逐行读取文件,然后用简单的字符串函数检查每一行的第一个字符来解决,但下面是如何在Java中对字符串进行增量替换的方法:

Pattern p = Pattern.compile("^%");
Matcher m = p.matcher(text);
StringBuffer sb = new StringBuffer();
int i = 0;
while (m.find()) {
    m.appendReplacement(sb, String.valueOf(i++));
}
m.appendTail(sb);

return sb.toString();
4

这里有一种在Python中实现的方法

import re
from itertools import count
s="""
% line one
% line two
% line three"""

def f():
    n=count(1)
    def inner(m):
        return str(next(n))
    return inner

new_s = re.sub("%",f(),s)

另外,你也可以在这里使用一个叫做lambda的函数,像这样:

new_s = re.sub("%",lambda m,n=count(1):str(next(n)),s)

不过其实完全不使用正则表达式会更简单、更好

from __future__ import print_function   # For Python<3
import fileinput

f=fileinput.FileInput("file.txt", inplace=1)
for i,line in enumerate(f):
    print ("{0}{1}".format(i, line[1:]), end="")

因为所有的行都是以“%”开头,所以根本不需要去看第一个字符

5

当然可以!请看下面的内容:

在编程中,有时候我们需要让程序做一些重复的事情,比如计算、处理数据等等。为了让程序更高效,我们可以使用循环。循环就像是一个指令,让程序不停地重复执行某些操作,直到满足特定条件为止。

比如说,如果我们想要计算从1加到10的总和,我们可以用循环来实现。程序会从1开始,加到10,每加一个数字就把结果更新,最后得到的就是1到10的总和。

循环有很多种类型,比如“for循环”和“while循环”。“for循环”通常用于已知次数的重复,而“while循环”则是在不知道具体次数的情况下使用,直到某个条件不再满足为止。

使用循环可以让我们的代码更简洁,也能减少出错的机会,因为我们不需要手动写很多重复的代码。

希望这个解释能帮助你更好地理解循环的概念!

n = 1
with open('sourcefile.txt') as input:
    with open('destination.txt', 'w') as output:
        for line in input:
            if line.startswith('%'):
                line = str(n) + line[1:]
                n += 1
            output.write(line)

撰写回答