为什么Text :: Balanced :: extract_bracketed不提取LaTeX标签内的文本?

时间:2016-03-01 18:53:44

标签: perl parsing latex

我试图使用Text :: Balanced中的extract_bracketed来解析平衡文本(实际上是用LaTeX编写的文本)。但是,我没有得到以下代码的正确匹配:

import pandas as pd
import glob
import datetime

filename = glob.glob('1511??.mnd')
data_nov15_hereford = pd.DataFrame()
frames = []
dates = []
counter = 1
for i in filename:
    f_nov15_hereford = pd.read_csv(i, skiprows = 32)
    for line in f_nov15_hereford:
        if line.startswith("20"):
            print line
            date_object = datetime.datetime.strptime(line[:-6], '%Y-%m-%d %H:%M:%S %f')
            dates.append(date_object)
            counter = 0
        else:
            counter += 1 
    frames.append(f_nov15_hereford) 
data_nov15_hereford = pd.concat(frames,ignore_index=True)
data_nov15_hereford = data_nov15_hereford.convert_objects(convert_numeric=True)


print dates

打印:

use Text::Balanced qw(extract_bracketed);

my $data = 'xxx \footnote{...} yyy';
(my $ext, my $rem, my $pre) = extract_bracketed($data, '{}', '\footnote');
print "\$ext = $ext\n";
print "\$rem = $rem\n";
print "\$pre = $pre\n";

根据documentation,此输出表示发生了故障,但我不明白为什么。

我实际想要提取的是$ext = $rem = xxx \footnote{...} yyy $pre = ,即...命令的内容。

为什么会发生这种情况,我该如何解决?

1 个答案:

答案 0 :(得分:2)

Text :: Balanced设置$@失败,因此您可以获得details about the cause

use strict;
use warnings 'all';
use 5.010;

use Text::Balanced qw(extract_bracketed);

my $text = 'xxx \footnote{...} yyy';
my ($substring, $remainder, $prefix) = extract_bracketed($text, '{}', '\footnote');

warn $@ if $@;

输出:

Did not find prefix: /\footnote/, detected at offset 0 at balanced line 12.

前缀不匹配,因为:

  • 它必须从字符串的开头一直到第一次出现的分隔符匹配

  • \f匹配换页符,而不是字母反斜杠,后跟字母f

以下前缀匹配第一个大括号的所有内容:

use strict;
use warnings 'all';
use 5.010;

use Text::Balanced qw(extract_bracketed);

my $text = 'xxx \footnote{...} yyy';

my ($substring, $remainder, $prefix) = extract_bracketed($text, '{}', '[^{}]*');
say "<$_>" for $prefix, $substring, $remainder;

输出:

<xxx \footnote>
<{...}>
< yyy>

要从文本中实际删除嵌套的脚注标记,保留其内容,您需要使用extract_tagged

use strict;
use warnings 'all';
use 5.010;

use Text::Balanced qw(extract_tagged);

my $text = '\footnote{abc \footnote{...} def \emph{!!!} ghi}';

my @pieces = extract_tagged(
    $text, 
    '\\\footnote{', 
    '}', 
    '(?s).*\\\footnote{.*(?=\\\footnote{)'
);

my ($remainder, $prefix, $contents) = @pieces[1, 2, 4];

say $prefix . $contents . $remainder;

输出:

\footnote{abc ... def \emph{!!!} ghi}

请注意,此方法适用于您提供的简单输入,但不能用作通用的LaTeX解析器。 CPAN上有几个LaTeX解析器,但LaTeX::TOM看起来相当有限,LaTeX::Parser自2000年以来一直没有更新。

如果您需要进行更复杂的解析,则可能需要编写自己的解析器。