如何从Perl中的文本中提取引用的部分?

西蒙

例如,从这样的文本中:

到1984年,迪伦(Dylan)远离了“重生”的标签。他对《滚石杂志》的库尔特·洛德(Kurt Loder)说:“我从未说过我会重生。那只是一个媒体术语。我不认为自己是个不可知论者。我一直以为有一种超强的力量,这不是现实世界,还有一个世界要来。”

我要提取:

  • “重生”
  • “我从来没有说过我会重生。那只是一个媒体术语。我不认为我是一个不可知论者。我一直认为有强大的力量,这不是现实世界,而是一个未来的世界。”

显然,文本本身中没有固定数量的引号,因此解决方案需要提取所有引用的部分。

我正在尝试Text::Balanced像这样:

extract_delimited($text, "\""); 

在一个循环中,但我什至无法提取“重生”-这将是一个好的开始。

Text::Balanced正确的工具吗?我怎么了?

托比墨

如果您不需要处理引号之类的引号,则Text :: Balanced可能会过大。

假设该"字符在字符串的开头或前面加一个空格将引起一个引号,而下一个"字符在字符串的末尾或其后带有非单词字符将引号结束,/(?:\s|\A)(\".+?\")(?:\W|\z)/sm则应捕获带引号的字符串,包括引号。

添加/g修饰符以捕获所有引号,您将获得:

use strict;
use warnings;
use Data::Dumper;

my $data = <<'DATA';
By 1984, Dylan was distancing himself from the "born again" label. He told
Kurt Loder of Rolling Stone magazine: "I've never said I'm born again.
That's just a media term. I don't think I've been an agnostic. I've always
thought there's a superior power, that this is not the real world and that
there's a world to come."
DATA

my @quoted_parts = ( $data =~ /(?:\s|\A)(\".+?\")(?:\W|\z)/gsm );

print Dumper \@quoted_parts;

Text :: Balanced在您需要处理例如可能嵌套在“([(()])”之类的不同括号中并且需要确保正确的结尾括号与正确的起始括号匹配时很有用。当您希望引号能够包含转义的引号字符时,此功能很有用。诸如此类的事情。它实际上是用于处理XML,JSON,编程语言,配置文件等方面的形式语言的解析。不适用于解析自然语言。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章