我有一个* 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)"
我无法获得正确的输出因此,如果有人指导我在哪里修改上述代码。提前谢谢。
答案 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始终配对,一组在一条线上。