PDA

Показать полную графическую версию : Perl и поиск совпадений


armandi
24-06-2010, 14:56
Ребяты помогите решить проблему...

Есть текстовый файл содержащий аннотации статей.
Необходимо извлечь фамилии авторов которые там находятся в формате Иванов И. И..

Написал скрипт с помощью рег. выражений, но он находит лишь первое совпадение

# Открываем файл
open(TEXT,"ww.txt") || die "Не могу открыть файл";
# Читаем его содержимое
@lines=<TEXT>;
# Закрываем файл
close TEXT;
# Помещаем содержимое файла в переменную $all, предварительно слив всё в одну строку
$all = join("",@lines);

if ($all=~ /([A-Яа-я]{2,20}\s[А-Я]\.\s[А-Я]\.)/) {print $1;}

Он печатает лишь первую фамилию в файле... остальных похоже даже не ищет...

Как сделать так чтоб он в этой строке находил все совпадения и печатал их в столбик (или записывал в файл)?

armandi
24-06-2010, 15:07
да и функция m/texttexttext/g тоже не помогает

mrcnn
24-06-2010, 15:20
if ($all=~ /([A-Яа-я]{2,20}\s[А-Я]\.\s[А-Я]\.)/) {print $1;}
Этот код выдирает только первое вхождение.
Чтобы выдрать все фамилии, нужно организовать цикл и на каждой итерации запомнить всю строку после каждой фамилии.

while ($all=~ /([A-Яа-я]{2,20}\s[А-Я]\.\s[А-Я]\.)(.*)/) {print $1;$all=$2;}

kim-aa
24-06-2010, 17:11
Построчная обработка файла в Perl
http://forum.oszone.net/thread-170360.html


# Помещаем содержимое файла в переменную $all, предварительно слив всё в одну строку
$all = join("",@lines); »

Я бы решал задачу по другому.
Сначала построчно искал все фамилии при помощи шаблона Regex и добавлял бы их в массив.
Потом бы при остром желании, удалял бы из массива дубли.

В случае предлагаемом вами нагрузка очень большая, т.к. по сути файл будет многократно перечитываться на предмет совпадений.




© OSzone.net 2001-2012