Regex 正则表达式匹配,但捕获组仍未初始化

Regex 正则表达式匹配,但捕获组仍未初始化,regex,perl,html-parsing,Regex,Perl,Html Parsing,我不熟悉perl和regex。我想我理解这个想法以及如何使用正则表达式,但我在编写脚本时遇到了一个问题。我有一些页面的内容,我正在尝试阅读一些信息 my @rows = split(/<tr(\s)bgcolor=.{8}/,$content); foreach my $row(@rows){ if( $row =~/<td\s+nowrap\s+align=.*\s?(bgcolor=.*\s+)?>\w*\s?<\/td>/ig){ print

我不熟悉perl和regex。我想我理解这个想法以及如何使用正则表达式,但我在编写脚本时遇到了一个问题。我有一些页面的内容,我正在尝试阅读一些信息

my @rows = split(/<tr(\s)bgcolor=.{8}/,$content);

foreach my $row(@rows){
    if( $row =~/<td\s+nowrap\s+align=.*\s?(bgcolor=.*\s+)?>\w*\s?<\/td>/ig){
    print $1;
    print $file_opt $row."\n";

    # there will be more code later on
    } 
}

而且
$content
中所有不必要的内容都不在文件中。那么这个模式是否匹配呢?

请不要手工编写正则表达式来解析html,yadda yadda,现在来回答您的实际问题:

“但是我在if下有regex,所以如果它进入if,它确实匹配,对吗?”

在正则表达式中,捕获组后面有一个
量词。这意味着它可以(在您的示例中也是如此)与查找您的捕获组匹配一次或多次。如果正则表达式的最佳匹配恰好涉及捕获组零次,则不会捕获任何内容,
$1
仍为空。去掉那个问号,确保你的正则表达式只在它确实捕获了一些东西时才匹配

如果在您的示例中这样使用,它会起作用并捕获一些内容


由于量词贪婪,我们可能会假设它总是能够捕获某些东西(如图所示,它在没有量词的情况下突然工作),但其中有这么多量词,这只是另一个首先贪婪的量词。

不要手工编写正则表达式来解析html,yadda yadda,现在谈谈你的实际问题:

“但是我在if下有regex,所以如果它进入if,它确实匹配,对吗?”

在正则表达式中,捕获组后面有一个
量词。这意味着它可以(在您的示例中也是如此)与查找您的捕获组匹配一次或多次。如果正则表达式的最佳匹配恰好涉及捕获组零次,则不会捕获任何内容,
$1
仍为空。去掉那个问号,确保你的正则表达式只在它确实捕获了一些东西时才匹配

如果在您的示例中这样使用,它会起作用并捕获一些内容


由于量词贪婪,人们可能会认为它总是能够捕获某些东西(如图所示,如果没有量词,它会突然工作),但那里有这么多量词,这只是另一个首先贪婪的量词。

从你文章中的代码中,看起来您正试图为给定行中的每个表单元格捕获
bgcolor
属性。并非所有单元格都设置了
bgcolor
,但有些单元格设置了。以下是如何使用以下方法提取该信息:

…这可能不是非常有用,但正是您发布的代码想要捕获的内容。至少这是一个起点,你应该能够适应自己的需要

我相信Mojo::DOM的文档更容易理解,这可能会有所不同,特别是如果您是Perl新手的话。我的建议是从这里开始,围绕该模块构建解决方案。从长远来看,使用正则表达式从HTML中提取数据要比用正则表达式把头发撕下来要好得多


Mojolicious发行版在大多数系统上安装不到一分钟,包括Mojo::DOM模块,它本身非常轻量级。这是一个很好的选择。

从您文章中的代码来看,您似乎正在尝试为给定行中的每个表单元格捕获
bgcolor
属性。并非所有单元格都设置了
bgcolor
,但有些单元格设置了。以下是如何使用以下方法提取该信息:

…这可能不是非常有用,但正是您发布的代码想要捕获的内容。至少这是一个起点,你应该能够适应自己的需要

我相信Mojo::DOM的文档更容易理解,这可能会有所不同,特别是如果您是Perl新手的话。我的建议是从这里开始,围绕该模块构建解决方案。从长远来看,使用正则表达式从HTML中提取数据要比用正则表达式把头发撕下来要好得多


Mojolicious发行版在大多数系统上安装不到一分钟,包括Mojo::DOM模块,它本身非常轻量级。这是一个很好的选择。

使用解析器。不要为此使用正则表达式。请改用HTML解析器。不要使用正则表达式来解析HTML。使用适当的HTML解析模块。您无法用正则表达式可靠地解析HTML,在这条路上您将面临悲伤和挫折。一旦HTML改变了您的预期,您的代码就会被破坏。有关如何使用已编写、测试和调试的现有Perl模块的示例,请参阅。我猜我的大学里有一些示例代码,但并不像每个人想象的那样好:使用解析器,而不是正则表达式。请改用HTML解析器。不要使用正则表达式来解析HTML。使用适当的HTML解析模块。您无法用正则表达式可靠地解析HTML,在这条路上您将面临悲伤和挫折。一旦HTML改变了您的预期,您的代码就会被破坏。有关如何使用已编写、测试和调试的现有Perl模块的示例,请参阅。我想我所在的学院并不像每个人想象的那样好:谢谢你如此详尽的回答。我一定会按照你的建议阅读更多关于你提到的软件包的内容:)@kamila为
Mojo::DOM
准备一段8分钟的介绍视频,请查看,谢谢你提供了如此详尽的答案。我一定会按照你的建议,阅读更多关于你提到的软件包的内容:)@kamila要获得一段8分钟的精彩介绍视频,请访问
Mojo::DOM
<td nowrap align="right">DOLNOŚLĄSKIE</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">0</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">0</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">0</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">0</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">4</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">1</td><td nowrap align="right" bgcolor=#D0E0D0 >1</td><td nowrap align="right">3</td><td nowrap align="right" bgcolor=#D0E0D0 >6</td><td nowrap align="right">1</td><td nowrap align="right" bgcolor=#D0E0D0 >2</td><td nowrap align="right">1</td><td nowrap align="right" bgcolor=#D0E0D0 >19</td><td nowrap align="right">0</td></tr>
use HTML::TreeBuilder 5 -weak;

my $html = q{<td nowrap align="right">DOLNOŚLĄSKIE</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">0</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">0</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">0</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">0</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">4</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">1</td><td nowrap align="right" bgcolor=#D0E0D0 >1</td><td nowrap align="right">3</td><td nowrap align="right" bgcolor=#D0E0D0 >6</td><td nowrap align="right">1</td><td nowrap align="right" bgcolor=#D0E0D0 >2</td><td nowrap align="right">1</td><td nowrap align="right" bgcolor=#D0E0D0 >19</td><td nowrap align="right">0</td></tr>};

my $t = HTML::TreeBuilder->new_from_content($html);

foreach my $col ( $t->look_down('_tag','tr')->content_list ) {
  print $col->attr('bgcolor'), "\n" if defined $col->attr('bgcolor');
}
use Mojo::DOM;

my $html = q{<td nowrap align="right">DOLNOŚLĄSKIE</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">0</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">0</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">0</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">0</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">4</td><td nowrap align="right" bgcolor=#D0E0D0 >0</td><td nowrap align="right">1</td><td nowrap align="right" bgcolor=#D0E0D0 >1</td><td nowrap align="right">3</td><td nowrap align="right" bgcolor=#D0E0D0 >6</td><td nowrap align="right">1</td><td nowrap align="right" bgcolor=#D0E0D0 >2</td><td nowrap align="right">1</td><td nowrap align="right" bgcolor=#D0E0D0 >19</td><td nowrap align="right">0</td></tr>};

for my $td ( Mojo::DOM->new($html)->find('td[bgcolor]')->each ) {
  print $td->attr('bgcolor'), "\n";
}
#D0E0D0
#D0E0D0
#D0E0D0
#D0E0D0
#D0E0D0
#D0E0D0
#D0E0D0
#D0E0D0
#D0E0D0
#D0E0D0