繁体   English   中英

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

[英]Find and replace text iteratively from a list

假设我有这些文字:

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

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

找:

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

更换:

$1apple$2

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

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

这个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)

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

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

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

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

在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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM