Модераторы: ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Каких конструкций в регекспах Perl вам не хватает? 
:(
    Опции темы
arto
Дата 15.5.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: нет
Всего: 40



perldoc re::engine::Suppir ?
PM MAIL ICQ   Вверх
Suppir
Дата 15.5.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Да ладно вам стебаться. Если б регулярные выражения оставались такими, какими они появилсь, то мы бы писали километровые шаблоны для разбора простейших случаев.
PM MAIL   Вверх
arto
Дата 15.5.2009, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: нет
Всего: 40



по-вашему, вся программа должна состоять из одного, средних размеров регулярного выражения?
("make me happy" рассматриваем как эктремальный вырожденный случай, к которому надо стремиться).
PM MAIL ICQ   Вверх
Suppir
Дата 15.5.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



arto, мне кажется, нужно стремиться к более высокоуровневому представлению. 
Чтобы не пришлось описывать все варианты руками. Имхо это может дать Perl новую жизнь.
.
1) например, если у меня в регулярном выражении /кошка/, я хочу, чтобы слово "кошка" нашлось и в ANSI и DOS и в UNICODE кодировках (чтобы регулярное выражение для юникода было таким же как и для других кодировок)
2) нечеткий поиск, например /?2:конституция/ - любые две буквы могут не совпадать
3) поддержка синонимов. Имхо это очень крутая фича, особенно для поиска-замены.
4) автоматическая упаковка набора из регулярных выражений. Например, у меня для разбора текста написаны 200 регулярок. Из них большинство пересекаются (есть одинаковые конструкции). Соответственно, их можно преобразовать в один автомат, и очистить от повторяющихся (лишних) состояний. Это значительно ускорит поиск. 


Это сообщение отредактировал(а) Suppir - 15.5.2009, 15:19
PM MAIL   Вверх
arto
Дата 15.5.2009, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: нет
Всего: 40



1. проще все привести все данные к одной кодировке. каким автоматом вы распознаете koi8-r, cp1251 и iso-8859-1 ?
2. проще выделить слово и самому проверить его.
3. пример?
4. типа ORM, который perl-код переводит в sql, от которого плачут dba?


PM MAIL ICQ   Вверх
Suppir
Дата 15.5.2009, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



to arto:
1. 
Допустим, у меня данные в cp866 (dos), cp1251 (ansi) и unicode. Я хочу написать одно регулярное выражение, и чтобы оно работало в любой кодировке. Первые две похожи, но регулярка для юникода делается иначе.

2. 
Фразу "Интернет-сайт" могут написать так: "Интернет-сайт", "интернет сайт" и так далее. Достаточно набрать /(?3:интернет сайт)/ - и регулярка найдет все возможные варианты. А если написать s/(?3:интернет сайт)/интернет сайт/, то Perl преобразует варианты к одному виду.

Другой пример - поиск текста с ошибками и опечатками. Слово может быть набрано "Итернет-сайт", "презедент", "инструция" - как вы его найдете обычным регулярным выражением? Никак.
Еще пример - ошибка распознавания при сканировании. Вместо какой-нибудь буквы может быть цифра (о - 0, 1 - i), вместо кириллической буквы латинская (o - о, p - р). В шаблоне вы ведь не сможете учесть все варианты ошибок. А с нечетким поиском достаточно ввести правильный шаблон и максимальное допущение.


3. Например, я хочу найти все документы 2009 года:
/\d{1,2} мая 2009 года/    - найдутся и "мая" и "апреля" и "июня"
также исключение лишних синонимов из текста:
замена слов одно на другое с учетом окончаний (вы ведь не будете вручную все окончания перебирать)
и так далее. 

PM MAIL   Вверх
arto
Дата 15.5.2009, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: нет
Всего: 40



1. пример -- "опхбер", это в какой кодировке? откуда perl узнает кодировку?

2. /интернет[\s-]+сайт/i, не подойдет?

угу, как сделать в слове из 3 букв 4 ошибки? грамотность написание -- проблема не perl, а средней школы.

3. а "февраль" не найдется? а почему? а "maaliskuu"? а почему?

ps. семимильными шагами идем к /<make me happy>/ :)
PM MAIL ICQ   Вверх
Suppir
Дата 15.5.2009, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



arto, насчет ошибок. Я разбираю документы органов власти (официальные документы, регламентирующие нашу жизнь) - там сотни ошибок на мегабайт. Причем, самые неграмотные чиновники в департаментах образования и здравоохранения smile Так вот, если одна и та же ошибка повторяется в различных падежах, то удобно не перебирать все варианты падежей, а один раз написать как есть.
Конечно, если использовать регулярные выраженияl только для разбора логов, то, наверное, эти фичи не нужны.
PM MAIL   Вверх
arto
Дата 15.5.2009, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: нет
Всего: 40



полагаю, неграмотность российских чиновников должна волновать их начальство, а не разработчиков perl.
PM MAIL ICQ   Вверх
Suppir
Дата 15.5.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



К сожалению, начальников это мало волнует :( 
Приходится перелопачивать весь текст - искать ошибки, приводить к единому виду. Юзаю (в основном) архивариус 3000, powergrep и perl. Архивариус - для поиска с поддержкой морфологии, powergrep - для пакетных фильтров и замен в тексте, а Perl - как универсальный инструмент для сложных случаев. 
Вот эти вышеперечисленные фичи Perl принесли бы огромную пользу, по крайней мере в моей работе smile 
Наверное, их не так просто реализовать, хотя, я, кажется, видел модуль нечеткого поиска на CPAN...

Это сообщение отредактировал(а) Suppir - 15.5.2009, 17:07
PM MAIL   Вверх
arto
Дата 15.5.2009, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: нет
Всего: 40



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

скорее вам надо смотреть на какие-нибудь антиматы, там попадаются интересные алгоритмы.
PM MAIL ICQ   Вверх
Suppir
Дата 15.5.2009, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 588
Регистрация: 20.4.2009

Репутация: нет
Всего: нет



Если кто знает софтину для поиска/замен со следующими функциями:

1) поиск/замена в .doc, .pdf, поддержка юникода
2) регулярные выражения Perl (PCRE)
3) поиск (и замена) с учетом морфологии (русский язык)
4) поиск орфографических, пунктуационных ошибок
5) возможность создавать и редактировать коллекции фильтров 
6) поддержка нечеткого поиска

то дайте знать smile


PM MAIL   Вверх
Logo
Дата 15.5.2009, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



Цитата

ага, диапазоны чисел пожалуй круто будет.. я бы еще предложил возоможность вставки предикатов на perl в регулярки
... что бы например поиск числа < 515 выглядел так
Код

/(\d{1,3})(?*****{ $1 < 515 })/


Внимание: это невалидный код, всего лишь пожелание.


Можно реализовать с помщью перегрузки, но конечно по скорости будет уступать встроенной возможности, плюс некоторые ограничения, налагаемые перегрузкой.

Учет языка это скорее удел библиотек, а не ядра. Запихать туда множество языков мира, плюс различные профессиональные сленги не реально smile
Где-то видел платную Perl/PHP либу для поиска с учетом морфологии.
PM MAIL   Вверх
sir_nuf_nuf
Дата 16.5.2009, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 1
Всего: 31



Цитата(Logo @  15.5.2009,  19:28 Найти цитируемый пост)
Можно реализовать с помщью перегрузки

Это как такое реализовать ?



--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Logo
Дата 17.5.2009, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 5
Всего: 10



В книге у Фридла писалось

sample.pl
Код

#!/usr/bin/perl
use lib '.';
use regexaddon;


#применяем перегруженную конструкцию
'qwe 100' =~ /\fd{<123}/;


regexaddon.pm
Код

#!/usr/bin/perl

package regexaddon;
use strict;
use overload;
use warnings;

sub import {overload::constant qr => \&transform}

sub transform($) {
  my ($reg)=@_;  #в $reg кусок регулярки исходной
  # некий код, преобразующий все вхождения  \fd{<123} в perl регулярку, выполняющую такие действия
  return $reg;
}
1;


О плохом, самое плохое нельзя будет использовать интерполяцию переменной внутрь конструкции, например \fd{<$numeric}.
Еще нельзя будет использовать новую конструкцию в строке, которая интерполируется в регулярное выражение, можно только в конструции qr//;
Код

#не будет работать
$subreg='\fd{<123}';
m/$subreg/;

#будет работать
$subreg=qr/\fd{<123}/;
m/$subreg/;



PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.0640 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.