Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Регулярные выражения

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97

Открыть новую тему     Написать ответ в эту тему

leftMIND

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
   Регулярные выражения
Обучающий материал
  • Книги    
  • Шпаргалки: от AZJIO (AutoIt3, PCRE) от Dave Child
  • wikipedia.org - Регулярные выражения на wiki  
  • edlinsoft.blogspot.com - Регулярные выражения в .NET Framework  
  • php.ru - Синтаксис регулярных выражений  
  • php.net - Синтаксис регулярных выражений  
  • regexpstudio.com - Регулярные выражения для Delphi  
    Официальные источники:
  • docs.notepad-plus-plus.org - Официальный источник Notepad++ (англ. яз.)  
  • pcre.org - Официальный справочник движка PCRE (англ. яз.)  

  •    Тестирование регулярных выражений
    Программы
    Онлайн сервисы
  • RegexBuddy - крутая и платная  
  • RegExp - бесплатно, AZJIO, PCRE, AutoIt3  
  • Expresso  
  • The Regex Coach  
  • RegExstar, Github (AutoHotKey, PCRE)
  • Обзор программ от ManHunter    
  • regexr.com здесь в Community множество готовых регулярных выражений  
  • pagecolumn.com - для javascript  
  • pagecolumn.com - для php  
  • cuneytyilmaz.com - для javascript  
  • php-include.ru - на флеш-плеере  
  • regex101.com  
  • easyregexp.ru  
  • debuggex.com - показывает структурно  

  •    Схожие темы
  • javascript регулярные выражения
  • PHP: Регулярные выражения (RegExp, Regular, eregi, preg)
  • Игра - Регулярно выражайтесь!
     
    первое сообщение темы...
    Обсуждение шапки данной темы ведётся в этой теме
    Рекомендации по составлению вопросов в данной теме:

  • Всего записей: 33 | Зарегистр. 07-04-2002 | Отправлено: 23:55 15-10-2002 | Исправлено: AZJIO, 15:18 12-02-2021
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov

    Цитата:
    подумал, что это более простая задача.

    это, как раз, далеко не простая задача...
    Можно сравнивать либо строки, либо какой-то набор символов, который отбирается по каким-то признакам, а так... любые символы, причем во фрагменте неопределенной длины, даже не ограниченный строкой... не знаю, это сродни: "пойди туда, не знаю куда, найди то, не знаю что"
    Вряд ли это реализуемо на регэкспах.

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 20:02 19-05-2019
    Jonmey

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Я уже устал искать варианты решения своей задачи  

    Складывается впечатление, что вы пытаетесь решить задачку, которую вам задали по программированию в учебном заведении одним регэкспом и нахаляву.
    Это впечатление оттого, что люди реально желающие решить свою конкретную реальную задачу очень конкретны в своих просьбах, условиях и ответах на вопросы помогающим. Вы же опрерируете лишь общими, абстрактными условиями, которые не похожи на то что вы решаете реальную практическую задачу, а не учебную.

    Всего записей: 1366 | Зарегистр. 17-01-2011 | Отправлено: 20:16 19-05-2019
    IvanStepanov

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подробнее...

    Всего записей: 136 | Зарегистр. 11-05-2019 | Отправлено: 20:55 19-05-2019 | Исправлено: IvanStepanov, 21:22 19-05-2019
    Jonmey

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov
    Если я правильно понимаю, то ваша задача требует возможностей неточного сравнения текстовых данных (то есть, с переменной степенью похожести). Попыток написать такую программу мне известно только одна и та давно канула в лету. Но и этого не достаточно, поскольку в вашем случае к первой возможности необходима возможность плавающей выборки в анализируемых текстах.
    Но если первая задача при анализе даже десятков тысяч текстов длиной до 2тыс. символов между собой требует многочасовой работы достаточно мощного компа, то обе функции, даже если их реализовать в одной программе, потребуют мощности среднего суперкомпа.
     
    В общем, желающие вам помочь потеряют напрасно время и силы.

    Всего записей: 1366 | Зарегистр. 17-01-2011 | Отправлено: 04:30 20-05-2019 | Исправлено: Jonmey, 04:42 20-05-2019
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov

    Цитата:
    Могу ошибаться, в деталях, но что-то подобное точно есть в REGEX.

    Есть-то оно есть, да только Вы не совсем внимательно прочитали то, что я написал выше...

    Цитата:
    что-то типа(блаблабла).*?(!?=\1) и вуаля.

    вот это вот что-то типа, работать будет только потому, что есть:
     19-05-2019

    Цитата:
    какой-то набор символов, который отбирается по каким-то признакам

    а именно, вот это вот:

    Код:
    (блаблабла)

    и есть отобранный по шаблону набор символов, копия которого затем ищется по обратной ссылке \1
    именно так получается "вуаля"
     
    У Вас же в условии:
     19-05-2019

    Цитата:
    "найти в тексте максимально длинные не пересекающиеся одинаковые (без учета пробельных символов) куски текста"

    т.е. по сути, Вы желаете получить что-то типа:

    Код:
    (.*)(?=.*?\1)

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

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 11:26 20-05-2019 | Исправлено: YuS_2, 11:33 20-05-2019
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov
    Мы уже пришли к выводу, что ваша задача не имеет решения в контексте только регулярных выражений. Но это не значит, что он нерешаема в принципе. Тут нужны программы типа TextPipe и PowerGREP. Но самое главное, вам нужно, в первую очередь определиться с границами текстовых блоков. Иначе, если искать от любой позиции, то это миллионы итераций даже на небольшом тексте. А если ещё принять во внимание ваше пожелание по поводу "в произвольном порядке", либо "без учёта пробелов", то это ещё на порядки больше.
     
    Взгляните на проблему с другой стороны. Вы же сохраняете текст из интернета, так? Значит, скорее всего в качестве исходников у вас файлы HTML, вероятно. Если вам нужно идентифицировать и удалить эти самые "сниппеты яндекса", то почти наверняка, у них должен быть какой-либо идентификатор. Это может быть тег, его атрибут, класс, специфическая структура тегов, либо что-то другое. Но, уверен, что что-то должно быть, за что можно зацепиться. С помощью TextPipe, к примеру, вы находите и удаляете такие блоки текста (там можно писать свою программную логику на JS или VBScript, но можно попробовать обойтись и встроенными фильтрами).
     
    В общем, думаю, это единственное адекватное решение для вашей ситуации. Искать повторяющийся текст регулярками, да ещё учитывая ваши специфические требования - это тупиковый путь.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 11:58 20-05-2019
    IvanStepanov

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подробнее...
     
    Добавлено:
    Подробнее...

    Всего записей: 136 | Зарегистр. 11-05-2019 | Отправлено: 12:17 20-05-2019
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov (Пост)

    Цитата:
    Смотрю сейчас в сторону текстового редактора EMACS. Он из коробки поддерживает написание скриптов на LISP.

    Вы серьёзно? Учить EMACS с LISP это примерно как освоить 3Ds MAX на нормальном уровне или AutoCAD. Это целая планета. Нет, если вы, конечно, полны желания и решимости, то удачи вам. Но пока вы продемонстрировали только непонимание даже простейших концепций, относящихся к регулярным выражениям и работе с текстом. Извините - сделал такой вывод из написанного вами.
     
    Ещё раз. Каковы ваши исходники? Нужно исходить из этого.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 12:32 20-05-2019
    IvanStepanov

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подробнее...
     
    Добавлено:
    Romul81

    Цитата:
    Ещё раз. Каковы ваши исходники?  

    PDF и DJVU файлы
    DOC-файлы
    Файлы инетовского формата (HTML, PHP и т.п.) причём скаченные в разные годы разными программи или проксей
    И ещё пара сотен форматов.
    Т.е. всё, что "переваривает" архивариус 3000 и что он нашёл у меня на харде
     
    Вообщем там целый зоопарк форматов, кодировок и т.п.
     
    Причём в искомые фрагменты входят служебные символы типа ~$^# и т.п (мусор от пересохранения).
    Что ещё больше затрудняет выявление границ текстовых блоков

    Всего записей: 136 | Зарегистр. 11-05-2019 | Отправлено: 12:40 20-05-2019
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov (Пост)

    Цитата:
    Вообщем там целый зоопарк форматов, кодировок и т.п.

     
    Изначально ваш вопрос заключался в идентификации и удалении "сниппетов яндекса", которые содержали повторяющиеся блоки текста. Как они попали в PDF и DJVU файлы? Вы как-то перепрыгиваете с темы на тему. Теперь вопрос в том, чтоб найти дубликаты во всей вашей библиотеке. Вы же понимаете, что это НЕРЕАЛЬНО? Без каких-либо чётких критериев.. Что считать "оригиналом", а что "дубликатом"? Да там вообще десятки вопросов могут возникнуть по ходу...
     
    В общем, без конкретики - этой пустой разговор, впустую отнимающий время. Поставьте чёткую задачу, если хотите, чтоб вам помогли.
     
    Ещё раз - "найти дублирующиеся блоки текста" - это слишком расплывчато, эфемерно и недостаточно для нахождения адекватного решения.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 12:57 20-05-2019 | Исправлено: Romul81, 12:58 20-05-2019
    YuS_2



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov

    Цитата:
    А если я буду использовать не (.*), а что-то более определенное? Типа того, что Вы мне написали для поиска фрагментов, содержашего не менее 5-ти слов из заданного списка из 10 слов? Задача имеет же решение?  
     
    Т.е. раз реализовать нужную мне функцию, делающую всё в полном автомате трудно, то мне хотя бы в полуавтомате сделать. Т.е. что-то вручную набивать (REGEX-ы предположительно повторяющиеся фрагментов), а что-то выполнять автоматически

    Да, если будут хоть какие-то конкретности, от которых можно отталкиваться, то задача значительно упрощается.
    Скажем, если добавить условия в эту Вашу недетерминированную задачу, что фрагменты должны быть не менее 10 символов, сравнение вестись будет с учетом пробельных символов (пока для наглядности так, но, в принципе, их конечно можно и удалять и сравнивать без них) и регистрозависимость присутствует, тогда можно состряпать что-то вроде:
    powershell

    Код:
    $regexp = '(?sm-i)(.{10,})(?=.*?\1)'
    $file = 'test.txt'
    $arr = gc $file -raw|sls -patt $regexp -all
    $a = ($arr.matches|? length -ge 10).value
    write-output "Всего совпадений: $($a.length)"
    write-output '=========='
    foreach ($item in $a){
        write-output "Длина фрагмента: $($item.length)"
        write-output '---'
        write-output $item
        write-output '=========='
    }

    Пробовать лучше на небольшом объеме текста, постепенно увеличивая этот объем до реального, при этом выполняя замеры времени.
    Но надо учитывать, что найденный фрагмент, имеющий повторы, захватывается только первый и если внутри этого фрагмента существуют ещё повторы, то уже во втором, т.е. повторном фрагменте, новые фрагменты будут также найдены. Пример:

    Код:
    abc 1234567890 1234567890 vbc   1234567890 1234567890 fgh

    дадут результат:

    Код:
    Всего совпадений: 2
    ==========
    Длина фрагмента: 23
    ---
     1234567890 1234567890
    ==========
    Длина фрагмента: 11
    ---
     1234567890
    ==========

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 13:13 20-05-2019
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Т.е. всё, что "переваривает" архивариус 3000
    то есть надо написать сначала архивариус, чтобы он из PDF, DJVU вытащил тексты, разные типы DOC, если новые DOCX это просто архив с частично метками RTF, то старые я даже не в курсе формата сжатия. В купе с анализаторами HTML, PHP, RTF, чтобы отсеять теги, скрипты, плюс ко всему этому движок рекавери, умеющий распознать тип вышеперечисленных файлов, которые умеет переваривать архивариус. Ещё поддержка извлечения архивов, быза почтовых клиентов (судя по описанию архивариуса). В общем как минимум требуется написать всего лишь "ABBYY FineReader".

    Всего записей: 4545 | Зарегистр. 03-05-2006 | Отправлено: 13:34 20-05-2019 | Исправлено: AZJIO, 13:38 20-05-2019
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    AZJIO (Пост)

    Цитата:
    В общем как минимум требуется написать всего лишь "ABBYY FineReader".

     
    возьмётесь? Мне кажется в AutoIt  для вас невозможного нет

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 13:37 20-05-2019
    IvanStepanov

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подробнее... [/more]

    Всего записей: 136 | Зарегистр. 11-05-2019 | Отправлено: 16:21 20-05-2019 | Исправлено: IvanStepanov, 16:42 20-05-2019
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov (Пост)

    Цитата:
    Что не ясного?

     
    Да много чего. Я уже понял, что вы работаете с данными исключительно в текстовом формате (экспортированными из архивариуса). Но лучше от этого не стало. Повторяющиеся фрагменты находятся строго в одном файле? Или могут присутствовать в нескольких?
    Дальше. Простую регулярку типа (.{10,})(?=.*?\1) нельзя использовать, т.к. она может захватывать простые длинные слова, или устойчивые сочетания слов, которые дубликатами вовсе не являются. Поэтому, регулярку нужно усложнять до слова. Причём, надо будет установить минимальное кол-во слов, которые будут означать повтор. 1-2 будет недостаточно - будет много ложных срабатываний.
    Если пытаться подхватывать пробело-независимые совпадения, или, что ещё сложнее, неточный поиск - то это совсем другая история. Для этого в любом случае надо будет использовать какой-нибудь язык программирования, с подключением соответствующей библиотеки, например, вычисляющей Расстояние Левенштейна. Это вопрос точно не для этой ветки.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 16:44 20-05-2019
    obtim



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите с выделением части текста в notepad++. Есть много строк с содержимым вида  (25:19,25:23)'
    Перед первой скобкой стоит пробел. между скобками может быть любое количество блоков чисел вида xx:xx,xx:xx,xx:xx
    Надо скопировать из всех строк то, что между скобками. Именно в такой структуре.
    Каким регулярным выражением можно выделить нужную информацию?

    ----------
    Дьявол коварен - он может явиться к нам просто в образе дьявола

    Всего записей: 9021 | Зарегистр. 03-03-2002 | Отправлено: 16:51 20-05-2019
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    obtim
    Сэмпл под кат, пожалуйста. Что нужно захватить выделите цветом.

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 16:54 20-05-2019
    obtim



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81
    Спрятал

    ----------
    Дьявол коварен - он может явиться к нам просто в образе дьявола

    Всего записей: 9021 | Зарегистр. 03-03-2002 | Отправлено: 17:06 20-05-2019
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    obtim

    Код:
    (?<=\()\d\d:\d\d(?:,\d\d:\d\d)*(?=\))

    Всего записей: 1329 | Зарегистр. 03-03-2008 | Отправлено: 17:19 20-05-2019
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    obtim
    А нельзя текстом выложить? мне самому это печатать?
    Бегу на работу, вот по-быстрому

    Код:
    \((\d{2}:\d{2},)*\d{2}:\d{2}\)


    Всего записей: 4545 | Зарегистр. 03-05-2006 | Отправлено: 17:20 20-05-2019
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Регулярные выражения


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru