【问题标题】:Regex across multiple lines跨多行的正则表达式
【发布时间】:2013-12-02 16:39:49
【问题描述】:

我能够根据您的建议成功提取所有内容。我的问题如预期的那样出现,正则表达式没有正确识别某些东西......非常感谢!这是我的结束代码...希望对某人有所帮助!

        if($_=~/(Research Interests)/){
            $research = "Research Interest";

            if($_=~m/<h2>Research Interests<\/h2>(.*?)<p>(.*?)<\/p>/gs){
                    @researchInterests = split(/,+/, $2);
                    $count = 1;
                    foreach(@researchInterests){
                            print "$research $count:";
                            print $_. "\n";
                            $count++;
                    }
            }
    }

【问题讨论】:

  • 不幸的是我要使用正则表达式进行解析...
  • 告诉你的老师你不应该使用正则表达式来解析 HTML。对于您的任务,您或许应该考虑是否可以真正将&lt;h2&gt;Research Interests&lt;/h2&gt;^M 之类的字符串与正则表达式/&lt;p&gt;.*&lt;/p&gt;/ 匹配。
  • 把你的老师引向这个:stackoverflow.com/questions/1732348/…——然后找出你为什么不明白为什么这是一个非常不正确的教育习惯。
  • "这是我的结束代码...希望对某人有所帮助!"当您删除问题后,它将如何帮助任何人?

标签: regex perl


【解决方案1】:

问题是您一次只能阅读一行。您为什么不阅读整个文件并与之匹配。

my $file;
{
    local $/;
    $file = <FILE>;
}

【讨论】:

  • 我已将整个文件复制到一个文本文件中并正在搜索它。目标是提取某些领域——名称、研究兴趣等。所以我使用 RESEARCH INTEREST 行作为条件,告诉我我已经达到现在可以抓住我的研究兴趣的位置......这是不正确的逻辑吗?
  • $_ 包含"&lt;h2&gt;Research Interests&lt;/h2&gt;\r\n"。请重读。我没有说任何关于复制文件的事情。我说要匹配整个文件,而不仅仅是包含 Research Interests 的行。
【解决方案2】:

此时您可以简单地获取更多行:

while (<FILE>) {
  if (m/Research Interests/) {
    while (<FILE>) {
      if (m/<p>(.*)<p>/) {
        print "Research Interests: $1";
        last;
      }
    }
  }
}

我不知道你的文件是否很大,但值得学习不需要一次读取整个文件的技术,这样你就可以处理任意大的文件或流。

【讨论】:

  • 其实你知道的。如果 HTML 文件不容易放入内存,浏览器将如何显示它。一次读取整个文件的错误率要低得多。
  • 也许我应该说“我不在乎” =)。由于这看起来像家庭作业,我认为值得学习流兼容的处理技术。
【解决方案3】:

如果您绝对必须这样做,您可以尝试将换行符设置为 undef:

#!/usr/bin/perl
use warnings;
use strict;

my $infile = 'in.txt';
open my $input, '<', $infile or die "Can't open to $infile: $!";

my $reserch_interests;
$/=undef;
while(<$input>){
        if($_ =~ /(Research Interests)/){
            $reserch_interests = $1;
                if($_=~ m/<p>(.*)<\/p>/){
                        print "Title: $reserch_interests\nInterests: $1\n";
                }
        }

}

打印:

Title: Research Interests
Interests: Data mining, databases, information retrieval

【讨论】:

  • 修复了你的错位更改为$/。为什么使用while?我在 15 分钟前发布了一个更好的方法。
  • 感谢飞蛙,我越来越近了。我做了一些关于将换行符设置为 undef 的真正作用的阅读,因为我没有得到相同的结果而且我有点困惑。本质上,文件被作为一个整体复制,并且任何换行符都被忽略。这最初对我来说是有意义的,但我的输出实际上是在进行研究兴趣匹配之前打印两行 。这是我的输出...Title: Research Interests Interests: BS, PhD, Simon Fraser University
  • 您可能需要更改正则表达式。粘贴更多您的输入,以便我们解决问题所在...
  • 好的,所以我一直在玩这个以试图理解它..我已经走了这么远......我似乎仍然在抓住每个研究兴趣的问题:跨度>
  • 我的意思是,我可以编写一个正则表达式,它能够提取你所追求的信息,但正如其他人所说的那样——你真的不应该费心使用正则表达式解析 HTML。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多