Perl / regex检查公司符号

时间:2011-08-15 05:25:11

标签: regex perl

我正在解析一个html文档..我终于到了这一点,我需要检查可能包含符号(1或多个)的行

  
    

AAPL,GOOG,MSFT
    AAPL
    GE
    GE,NVDA,IBM,CRM

  

正如您所看到的那些行可能包含一个或多个符号(以逗号分隔)。如何检查行以检查是否满足上述条件? (即检查一个或多个符号是否在正在处理的特定行中)

我的第一次尝试 - 它似乎不起作用(因为带有所有符号的行通常低于20个字符).. if($checkforcompanysymbol =~ m/^[a-z0-9]{0,20}$?/)

4 个答案:

答案 0 :(得分:1)

(1)您正在使用[a-z0-9]字符类,它是小写字母和数字0-9。公司符号为大写。您可能想要使用[A-Z0-9]。

(2)您的量词意味着至少 0 次但不超过20次。什么公司名称有0长度?您可能希望使用{1,20}(或更好地表征公司名称的其他数字)。

(3)我不确定你给的正则表达式是否足以表征公司符号?例如,假设您考虑(1)和(2)并使用[A-Z0-9] {1,20}将匹配NOTACOMPANY,除非我弄错了。如果是我,我只会列出我要检查的所有公司。

(4)你的正则表达式似乎没有考虑逗号。

答案 1 :(得分:1)

试试这个

^[A-Z]{1,4}(?:,\s?[A-Z]{1,4})*$

online here on Regexr

^匹配字符串的开头

[A-Z]字符类,匹配范围A-Z

中的任何字符

[A-Z]{1,4}匹配字符类

中的1-4个字符

(?:,\s?[A-Z]{1,4})* (?: ...)是一个非捕获组,,\s?是一个逗号,后跟一个可选的空格,1-4个字符,所有这些都是0次或更多次(因为{{ 1}})。

*匹配字符串

的结尾

答案 2 :(得分:0)

不确定$?最后在做什么,但您可以尝试:

m/\b\w{1,4}\b/

m/\b[a-zA-Z]{1,4}\b/

看起来像 it works for me

while (<DATA>){
   print "$..\t$_";

   my @matches = (/\b([a-zA-Z]{1,4})\b/g);     # can use \w instead of [a-zA-Z]

   if ( scalar(@matches) ){
      print "\tMatched: [" 
          , join( "\|" , @matches ) 
          , "]\n\n" 
   }
}

__DATA__
A
B
C
AAPL, GOOG, MSFT
AAPL
GE
GE, NVDA, IBM, CRM
X
Y
Z
FOOBAR    
('GE, MSFT')

答案 3 :(得分:0)

使用csv模块对于此数据集可能有点过分,但这是一种方法。为了好玩,添加了一些矫枉过正的排序和计数:

<强>代码:

use strict;
use warnings;
use Text::CSV_XS;

my $csv = Text::CSV_XS->new({
    allow_whitespace => 1,
});

my @list;
while (my $row = $csv->getline(*DATA)) {
    for (@$row) {
        push @list, $_ if /^\w{1,4}$/;
    }
}

my %count;
for (@list) {
    $count{$_}++;
}

for (sort { $count{$b} <=> $count{$a} || $a cmp $b } keys %count ) {
    printf "%-6s %-3s\n", $_, $count{$_};
}

__DATA__
A
B
some random line messing regexes up
,,
C
AAPL, GOOG, MSFT
AAPL
GE
GE, NVDA, IBM, CRM
X

<强>输出:

AAPL   2
GE     2
A      1
B      1
C      1
CRM    1
GOOG   1
IBM    1
MSFT   1
NVDA   1
X      1
Y      1
Z      1