数组中的元素列表需要检查字符串中的每个元素

时间:2017-08-06 03:40:06

标签: perl

我有一个* TEX文件包含:

print(df)

          A         B    Col #3
0       NaN       NaN       NaN
1 -0.041158 -0.161571  0.329038
2  0.238156  0.525878  0.110370
3  0.606738  0.854177 -0.095147
4  0.200166  0.385453  0.166235

上面的* TEX内容我必须检查下面列出的数组元素列表:如果任何一个元素匹配,则按原样保留该行:如果没有一个元素匹配,那么我需要替换__DATA__ "\left({H^1}, \int {H^2}\right)" "\left({H^1},\bigoplus{H^2}\right)" "\left({H^1},{H^2}\right)" "\left({H^1}, \bigvee {H^2}\right)" \left(( \right)

我的阵列:

)

预期产出:

int frac prod sum oint bigvee bigcup bigcap bigoplus bigotimes

我尝试过:

"\left({H^1}, \int {H^2}\right)"
"\left({H^1},\bigoplus{H^2}\right)"
"({H^1},{H^2})"
"\left({H^1}, \bigvee {H^2}\right)"

我无法获得正确的输出因此,如果有人指导我在哪里修改上述代码。提前谢谢。

1 个答案:

答案 0 :(得分:1)

显示的数据

use warnings;
use strict;

use List::Util qw(none);

my @terms = qw(int frac prod sum oint bigvee bigcup bigcap bigoplus bigotimes);

my ($paren_L, $paren_R) = map { quotemeta $_ } '\left(', '\right)';

while (my $line = <DATA>)
{
    if (none { $line =~ /$_/ } @terms) 
    {   
        $line =~ s|$paren_L|(|; 
        $line =~ s|$paren_R|)|;
    }
    print $line;
}

__DATA__
"\left({H^1}, \int {H^2}\right)"
"\left({H^1},\bigoplus{H^2}\right)"
"\left({H^1},{H^2}\right)"
"\left({H^1}, \bigvee {H^2}\right)"

带输出

"\left({H^1}, \int {H^2}\right)"
"\left({H^1},\bigoplus{H^2}\right)"
"({H^1},{H^2})"
"\left({H^1}, \bigvee {H^2}\right)"

注释

  • 这并不能说明一行中多个括号内的表达

  • 在Latex中有(很多)其他方法可以指定parens(\big(\Bigg(等)。

另一方面,所示数据在Latex文档中是合理的。

这会多次超过这条线,但比单个正则表达式更灵活。

使用这样简单的模式,我们不需要为每个术语启动正则表达式引擎,而是可以构建一个具有替换的模式。替换也可以使用named capture groups

一次完成
my $re_terms = '(?:' . join('|', @terms) . ')';

while (my $line = <DATA>) 
{
    if ($line !~ /$re_terms/)
    {   
        $line =~ s/(?<L>$paren_L)|(?<R>$paren_R)/$+{L} ? '(' : ')'/eg;
    }   
    print $line;
}

产生相同的输出。

这确实需要以所示格式显示数据:parens始终配对,一组在一条线上。