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

时间:2017-10-03 04:47:26

标签: java python regex perl notepad++

假设我有这些文字:

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 ++来实现更长的文本和列表?或者我可以使用其他任何技术吗?

4 个答案:

答案 0 :(得分:0)

您可以尝试连续三次正则表达式替换:

<强>查找

([^?]*)?\?(.*)

<强>替换

$1apple$2

这里的诀窍是([^?]*)?\?匹配第一个问号之前的所有内容。这允许我们一次只能控制替换一个?占位符。

然后,您将从左到右重复上述替换,以获得其他两个关键字。

答案 1 :(得分: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)

不可否认,还有更好的方法,例如不将整个文件加载到字符串中。

答案 2 :(得分:0)

您可以使用以下正则表达式:

\?(?!(.|\s)*\?(.|\s)*)

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

答案 3 :(得分: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;