[英]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.