从列表中迭代查找和替换文本

4
假设我有这些文本:
Donec sollicitudin ? malesuada. "Curabitur" arcu erat, accumsan
id imperdiet et, porttitor at sem. Quisque velit nisi, ? ut
lacinia in, ? id enim. Proin eget tortor risus.

我有一个文本列表:

["apple", "banana", "cherry"]

我该如何将每个?的出现替换为列表中的文本?期望的输出为:
Donec sollicitudin apple malesuada. "Curabitur" arcu erat, accumsan
id imperdiet et, porttitor at sem. Quisque velit nisi, banana ut
lacinia in, cherry id enim. Proin eget tortor risus.

我可以使用Notepad ++来实现更长的文本和列表吗?或者有其他技术可以使用吗?


你可以编写脚本或编写简单的程序。 - rooni
4个回答

0
你可以尝试连续进行三个正则表达式替换:
找到:
([^?]*)?\?(.*)

替换:

$1apple$2

这里的技巧在于([^?]*)?\?匹配直到第一个问号之前的所有内容。这使我们能够一次仅对一个?占位符进行受控替换。
然后,您可以从左到右重复上述替换步骤来处理其他两个关键字。

谢谢,但这只是一个示例..我可能有数百个替换,只是担心如果逐个替换会出错..如果没有其他办法,我会这样做.. - Mrye
@Mrye 那么你可能需要使用Java或Perl等语言编写脚本来处理此问题。Notepad++只能做到这些。 - Tim Biegeleisen

0

这个 Python 脚本可以完成任务。如果列表中的 ? 比替换的数量多,它将把它们保留为 ?

import re

replacements = ["apple", "banana", "cherry"]
lines = ""

with open("file.txt") as file:
    lines = file.read()

def replace(m):
    if not replacements:
        return "?"

    return replacements.pop(0)

lines = re.sub(r"\?", replace, lines)

with open("file.txt", "w") as file:
    file.write(lines)

诚然,有更好的方法来完成这个任务,例如不将整个文件加载到字符串中。


谢谢,它正在工作。我尽量避免使用脚本,但没关系。 - Mrye

0
你可以使用以下正则表达式:
\?(?!(.|\s)*\?(.|\s)*)

它将选择最后一个 ? 并提供其索引。之后,您可以用数组的最后一个元素替换它(如果您创建一个包含 ["apple", "banana", "cherry"] 的堆栈,则最好使用 stack.pop 方法始终会给您最后一个元素)。

0
在 Perl 中:
$text =~ s{\?}{shift @fruits}eg;  # Consumes @fruits array

或者

my $i = 0;
$text =~ s{\?}{$fruits[$i++]}g;   # Preserves @fruits

循环遍历 @fruits(如果 ? 的数量超过水果的数量):
my $i = 0;
$text =~ s{\?}{$fruits[ $i++ % @fruits ]}g;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接