Perl / regex для проверки фирменных символов - PullRequest
0 голосов
/ 15 августа 2011

Я анализирую HTML-документ ... и, наконец, я дошел до того, что мне нужно проверить строки, которые могут содержать символы (1 или много)

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

Как видите, строки могут содержать один или несколько символов (разделенных запятыми).Как я могу проверить линию, чтобы проверить, удовлетворяет ли вышеуказанным критериям?(то есть, чтобы проверить, находится ли один или несколько символов в этой конкретной строке, обрабатываемой)

мой первый удар по нему - что, похоже, не работает (поскольку строка со всеми символами обычно меньше 20 символов) ..if($checkforcompanysymbol =~ m/^[a-z0-9]{0,20}$?/)

Ответы [ 4 ]

1 голос
/ 15 августа 2011

(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 голос
/ 15 августа 2011

Попробуйте это

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

См. онлайн здесь на Regexr

^ соответствует началу строки

[A-Z]класс символов, соответствует любому символу из диапазона AZ

[A-Z]{1,4} соответствует 1-4 символам из класса символов

(?:,\s?[A-Z]{1,4})* (?: ...) - группа без захвата, ,\s? -запятая, за которой следует необязательный пробел, 1-4 символа и все это 0 или более раз (из-за *).

$ соответствует концу строки

0 голосов
/ 15 августа 2011

Использование модуля 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
0 голосов
/ 15 августа 2011

Не уверен, что ваш $? делает в конце, но вы можете попробовать:

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

или

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

Похоже у меня это работает :

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...