我试图将文件中的某些字符串与Perl匹配,并使用正则表达式将其与等量的X字符进行匹配,长度与原始字符串长度相同。 例如,该文件可能包含以下内容:
"the quick brown hello world fox jumps over the world" etc. etc.
和一个字典,例如它的字符串如:"hello world"
,我之前会加载到数组中。
我希望得到以下结果:
"the quick brown XXXXX XXXXX fox jumps over the world" etc. etc.
答案 0 :(得分:3)
没有
但是,您的语言可能具有接受回调的正则表达式替换功能。然后你可以做这样的事情:
>>> re.sub(r'o+b', lambda m: 'x' * len(m.group(0)), 'foobar')
'fxxxar'
答案 1 :(得分:1)
您将使用带有/e
修饰符的替换表达式替换,以及重复运算符x
代码看起来像这样。 \Q
... \E
构造用于转义任何非字母数字字符,以便按字面解释它们而不是正则表达式元字符
use strict;
use warnings;
use 5.010;
my $s = 'the quick brown hello world fox jumps over the world';
my $pattern = 'hello world';
$s =~ s/(\Q$pattern\E)/'X' x length $1/e;
say $s;
the quick brown XXXXXXXXXXX fox jumps over the world
如果你想在替换的字符串中保留空格,那么你需要两个嵌套的表达式替换,比如这个
use strict;
use warnings;
use 5.014;
use Data::Dump;
my $s = 'the quick brown hello world fox jumps over the world';
my $pattern = 'hello world';
$s =~ s{(\Q$pattern\E)}{ s/(\S+)/'x' x length($1)/egr }e;
say $s;
the quick brown xxxxx xxxxx fox jumps over the world
或者,如果您运行的是非常旧版本的Perl(在v5.14之前),那么您需要这个
$s =~ s{(\Q$pattern\E)}{ (my $r = $1) =~ s/(\S+)/'x' x length($1)/eg; $r }e;
答案 2 :(得分:0)
不如ThiefM的回答(Python):
import re
str_to_replace = 'hello world'
print re.sub(str_to_replace, re.sub('\w', 'x', str_to_replace), \
"the quick brown hello world fox jumps over the world")
# another option
print "the quick brown hello world fox jumps over the world".replace(str_to_replace, re.sub('\w', 'x', str_to_replace))
<强>输出
the quick brown xxxxx xxxxx fox jumps over the world
@ rubenrp81的PHP解决方案:
<?php
$msg = "the quick brown hello world fox jumps over the world";
$str = "hello world";
$rep = preg_replace("/\w/", "x", $str);
$patt = "/$str/";
$res = preg_replace($patt, $rep, $msg);
echo $res; // prints: "the quick brown xxxxx xxxxx fox jumps over the world"
?>