我正在解析一个html文档..我终于到了这一点,我需要检查可能包含符号(1或多个)的行
AAPL,GOOG,MSFT
AAPL
GE
GE,NVDA,IBM,CRM
正如您所看到的那些行可能包含一个或多个符号(以逗号分隔)。如何检查行以检查是否满足上述条件? (即检查一个或多个符号是否在正在处理的特定行中)
我的第一次尝试 - 它似乎不起作用(因为带有所有符号的行通常低于20个字符)..
if($checkforcompanysymbol =~ m/^[a-z0-9]{0,20}$?/)
答案 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})*$
^
匹配字符串的开头
[A-Z]
字符类,匹配范围A-Z
[A-Z]{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