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

Поиск:

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


Опытный
**


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

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



1) не нравится, как работает оператор s/.../.../
например, выражение s/(а)(б)(в)/$1 $2 $3/ - раставляет пробелы между абв. Но если (б) в строке нет, то, соответственно, на месте $2 находится символ "в". Как-то нелогично. Имно нужно, чтобы если (б) нет, то чтобы и $2 - не было.
.
А какие конструкции вам не нравятся, и что бы вы хотели добавить в регекспы? smile

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


Эксперт
***


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

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



странное пишете.

# perl -le '$a = "abc"; $a =~ s#(a)(b)©#$1 $2 $3#; print $a; $a = "ac"; $a =~ s#(a)(b)©#$1 $2 $3#; print $a'
a b c
ac
#
PM MAIL ICQ   Вверх
Suppir
Дата 13.5.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



хм, точно. Наверное, что-то перепутал с примером (дома разберу, точно была проблема с обратныи ссылками)
.
Второй вопрос все же интересует:
А какие конструкции вам не нравятся, и что бы вы хотели добавить в регекспы? smile
PM MAIL   Вверх
Logo
Дата 14.5.2009, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Лично мне пригодились бы подобные конструкции, чтобы довели до ума перегрузку, ну и не помешала бы конструкция, что бы искать числа/диапазоны чисел.
PM MAIL   Вверх
sir_nuf_nuf
Дата 14.5.2009, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

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


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


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


Эксперт
***


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

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



\b(?:[0-4]\d\d|50\d|51[0-5]|\d?\d)\b, не оно?
PM MAIL ICQ   Вверх
Suppir
Дата 14.5.2009, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Модификатор нечеткого поиска? Например, строка ABCD, 
регулярка /(?1:ABBD)/ - вроде "одна любая буква может не совпадать". 


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


Эксперт
***


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

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



(?:.BBD|A.BD|AB.D|ABB.) ?
PM MAIL ICQ   Вверх
sir_nuf_nuf
Дата 14.5.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(arto @  14.5.2009,  17:51 Найти цитируемый пост)
\b(?:[0-4]\d\d|50\d|51[0-5]|\d?\d)\b, не оно? 

Оно. но оно вам самим нравится ?  Хотя это классика..

Вообщем что бы вот таких конструкиций не писать я и хотел перловые предикаты.



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


Опытный
**


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

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



arto, ну а если "5 букв могут не совпадать"? Перебирать все варианты в регулярном выражении очень сложно (и длинно). Было бы удобней, если такая фича на уровне механизма присутствовала. Конечно, поиск с таким модификатором будет медленный. И еще будет несколько ответов разной релевантности.
.
Еще вариант:
/<я> <люблю> <Perl>/
Хочу чтобы для слова в угловых скобках работали любые синонимы, с любыми окончаниями. Представляете как будет удобно? 
PM MAIL   Вверх
arto
Дата 14.5.2009, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



/<make me happy>/ && exit;
PM MAIL ICQ   Вверх
sir_nuf_nuf
Дата 14.5.2009, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



/make arto happy/ or die 'trying =)' ;


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


Опытный
**


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

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



Цитата(Suppir @  14.5.2009,  18:51 Найти цитируемый пост)
Хочу чтобы для слова в угловых скобках работали любые синонимы, с любыми окончаниями. Представляете как будет удобно?  

А еще чтобы они кофе умели готовить ;)


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
shamber
Дата 15.5.2009, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(KSURi @  15.5.2009,  10:26 Найти цитируемый пост)
А еще чтобы они кофе умели готовить ;) 
 
smile  заведите жену, она мнооого что умеет делать. Ее просто иногда нужно кормить smile

Это сообщение отредактировал(а) shamber - 15.5.2009, 10:30
PM MAIL Jabber   Вверх
Suppir
Дата 15.5.2009, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну а что там сложного в синонимах?
допустим слово "кошка" можно представить в современном синтаксисе как $cat='ко(шка|т|тенок)';
m/$cat/;
 и т.п.  smile

Добавлено через 1 минуту и 42 секунды
Только сделать обращение к библиотеке синонимов не через переменную, а на уровне синтаксиса. Библиотеку распространять модулем. Наверное, что-то подобное есть уже

Добавлено через 3 минуты и 42 секунды
<кошка>  - синонимы
<?!кошка> - антонимы
<!кошка> - синонимы кроме самого слова "кошка"

PM MAIL   Вверх
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   Вверх
sir_nuf_nuf
Дата 17.5.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это банальное переписывание регулярки. Меня интересует встраивание этого в движок + открытие доступа к внутренним переменным движка. 

А так - это не многим  круче, чем source filters


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


Опытный
**


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

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



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


 




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


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

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