Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl或Python任意正则表达式替换为捕获_Regex_Perl - Fatal编程技术网

Regex Perl或Python任意正则表达式替换为捕获

Regex Perl或Python任意正则表达式替换为捕获,regex,perl,Regex,Perl,我有一些脚本,可以将字典文件作为输入(哈希/dict),搜索文件并进行替换。这在Perl或Python中都是微不足道的。我还有一个Python脚本,它将从配置文件中获取正则表达式,并使用它来做一些事情。我搞不懂的是,如何从文件中提取一个regex字典,如果替换中有组引用,则使用它进行替换 下面是简单的示例代码: #!/usr/bin/perl use strict; use warnings; my @input_file = ("XYABCD134"

我有一些脚本,可以将字典文件作为输入(哈希/dict),搜索文件并进行替换。这在Perl或Python中都是微不足道的。我还有一个Python脚本,它将从配置文件中获取正则表达式,并使用它来做一些事情。我搞不懂的是,如何从文件中提取一个regex字典,如果替换中有组引用,则使用它进行替换

下面是简单的示例代码:

#!/usr/bin/perl

use strict;
use warnings;
my @input_file = ("XYABCD134"
                 ,"DFE*(&FDS"
                 ,"YDSF%@%d325"
                 ,"ABCD134DS");

my %dict = ('(\w+)BCD(\w+)', '$1EFG$2');

my $done = 0;

foreach my $line (@input_file) {
  foreach my $re (keys %dict){
    $done = 0;
    if ($line =~ /$re/) {
      $line =~ s/$re/$dict{$re}/g;
      print  "$line\n";
      $done = 1;
      last;
    }
  }
  print  "$line\n" unless $done;
}
在这种情况下,所需的输出应为 第一行是XYAEFG134,但我得到1EFG$2

我无法让编号的组正常工作,或者硬编码到脚本中的字典中,或者来自外部配置文件。在Python中,我甚至不太确定如何从这样的文本中获取match.group(1)或任何内容。我所知道的实现这一点的唯一方法是将整个正则表达式硬编码到它自己的块中,我宁愿把这一点告诉那些不一定懂perl或Python的人,让他们能够在不修改代码的情况下编写自己的正则表达式。我知道有些人编写的程序可以做到这一点,但我在我的环境中使用和提供给其他人的东西方面受到限制。

你想要的是
gsub\u modify


您是否希望打印以下内容
123

my$x=123;
我的$y='$x';
比如说$y;
不,那么为什么你希望你的代码片段有什么不同呢

s{…}{…}
是英语的简写

s{…}{qq{…}}e
所以

s/$re/$dict{$re}/g
相当于

s/$re/“$dict{$re}”/eg

无论从哪个角度看,代码中都没有
$1
。字符串文字仅包含
$dict{$re}
,因此只有
$dict{$re}
才能进行插值。

提示:
如果($line=~/$re/){$line=~s/$re/$dict{$re}/g;..}
是一种糟糕的方式,如果($line=~s/$re/$dict{$re}/g){……}@ikegami。我想我有点在python模式下,有点在让它工作(在我第一次意外地多次编写每一行之后,因为我有多个dict条目)。你还为每一行编译每一个模式,这是非常浪费的。在循环之前使用qr//编译它们。最后,你还有一个问题,如果你有规则a->B和B->C,如果你以a开头,你可能会以B或C结尾。@ikegami你的意思是因为perl中的散列是不排序的,如果我有一行匹配我的多个规则,它会改变在多次执行时随机执行的规则?我想这不是很好,但这也很快而且很脏,所以我不确定我是否担心。如果我不想使用CPAN模块(或者更可能是不能),有没有一种方法可以从本质上“取消引用”我的字符串并将其转换为文本?显然,模块完成了它,所以我想这是可能的。任何人都可以。如果他们可以安装脚本,他们就可以安装模块。如果你选择不太好,那就由你决定。我不会为你重新实现这个模块。为什么您希望某人的未经测试或几乎未经测试的代码超过某人经过良好测试的CPAN代码?