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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

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
    IvanStepanov

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

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



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

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

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

    Всего записей: 1327 | Зарегистр. 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 файлы? Вы как-то перепрыгиваете с темы на тему. Теперь вопрос в том, чтоб найти дубликаты во всей вашей библиотеке. Вы же понимаете, что это НЕРЕАЛЬНО? Без каких-либо чётких критериев.. Что считать "оригиналом", а что "дубликатом"? Да там вообще десятки вопросов могут возникнуть по ходу...
     
    В общем, без конкретики - этой пустой разговор, впустую отнимающий время. Поставьте чёткую задачу, если хотите, чтоб вам помогли.
     
    Ещё раз - "найти дублирующиеся блоки текста" - это слишком расплывчато, эфемерно и недостаточно для нахождения адекватного решения.

    Всего записей: 1327 | Зарегистр. 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".

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



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

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

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

    Всего записей: 1327 | Зарегистр. 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 будет недостаточно - будет много ложных срабатываний.
    Если пытаться подхватывать пробело-независимые совпадения, или, что ещё сложнее, неточный поиск - то это совсем другая история. Для этого в любом случае надо будет использовать какой-нибудь язык программирования, с подключением соответствующей библиотеки, например, вычисляющей Расстояние Левенштейна. Это вопрос точно не для этой ветки.

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



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

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

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



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

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



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

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

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



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

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

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



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

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


    Всего записей: 4409 | Зарегистр. 03-05-2006 | Отправлено: 17:20 20-05-2019
    obtim



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

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

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

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

    Пробельные символы как раз не проблема при программном решении задачи. Первый шаг при таком подходе - индексация текстового массива. Пофайлово - это просто, и реализовано в любой поисковой (по тексту) базе: из текста выбрасывается все лишнее по определенному алгоритму, таким образом, что остается голый набор значимых слов.
     
    Плавающая выборка - имелось ввиду что строка сравнения может быть произвольной длины и находиться в его теле в любом месте. При этом ее длина и положение последовательно меняются, перебирая все возможные варианты (с учетом искусственных ограничений на предельные значения), после каждого сравнения со строками в других файлах, выбранными аналогичным образом.
     Как очевидно, число вариантов неописуемо нулями, даже с учетом того, что единица - лексическое слово, а не байт.
    * * *
    Похожие картинки (видео, аудио) ищутся по другим алгоритмам, с использованием т.н. цифровых отпечатков и это оправдано, в силу того, что значимой информации в этих файлах много меньше, чем незначимой (разница идет на порядки). С текстами все сложнее, поскольку даже частица "не" в огромном тексте способна поменять смысл на прямо противоположный со всеми вытекающими.
    * * *
    Если powergrep пошагово вам помогает, то запишите все возможные дублирующиеся блоки в список, создайте многошаговый скрипт, выбрав соответствующую опцию в программе и выполните его одномоментно на всех файлах. Как уже сказано выше, универсального регэкспа для вашего случая просто не существует. Но любой литеральный текст можно расширить за счет регэкспов, подобно тому, как вместо  
    мама мыла раму
    можно, например, искать
    мам[^ ]*? .*? рам[^ ]*?(?=[ \n\r]|$)
    что на выходе найдет не только первую фразу, но и другие, типа
    мамы мыли рамы
    мама сломала раму
    мама выбросила раму
    маму ударила рама
    мама любит раму
    мама и рама
    мама не рама

    и т.д.

    Всего записей: 1319 | Зарегистр. 17-01-2011 | Отправлено: 19:54 20-05-2019 | Исправлено: Jonmey, 20:32 20-05-2019
    IvanStepanov

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

    Цитата:
    Но лучше от этого не стало. Повторяющиеся фрагменты находятся строго в одном файле? Или могут присутствовать в нескольких?  

    Блин, ребят.
    А если голову включить?
    Или вы хотите, чтобы я разжёвывал самые очевидные вещи?
    Ну вот сами подумайте: могут ли одинаковые куски текста встречаться в разных файлах, скачанных из инета?
    Естественно могут. Как иначе?
     
    И чуть выше я об этом сказал.
     
    Добавлено:
    Ребят! А может есть какой-то самый примитивный скриптовый язык для работы с регулярками?
    А может есть какие-то программы, работающие не с регулярками, а с грамматиками более высокого уровня?
     
    Ведь что нужно-то
     - IF THEN ELSE
     - функции доступа к файлам в каталоге (чтобы можно было "перебирать" по очереди все файлы)
     - Функция, которая может искать "назад" или "вперёд" с заданной позиции в файле и возвращающая позицию и сам найденный фрагмент, если соответствующая регулярка найдена, и "FFFF" - если не найдена
    - ну и, соответственно, переменные, для временного хранения промежуточных значений счетчиков, номеров позиций(курсоров), подстрок и строк
     
    Можете AutoIT, AutoHotKey?

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



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

    Цитата:
    А если голову включить?  
    Или вы хотите, чтобы я разжёвывал самые очевидные вещи?  
    Ну вот сами подумайте: могут ли одинаковые куски текста встречаться в разных файлах, скачанных из инета?  
    Естественно могут. Как иначе?  

    Вы заставили меня улыбнуться)) Спасибо))
    Если серьёзно - то это вовсе не так очевидно. Всё зависит от контента, с которым вы работаете. Дубликаты файлов - да, согласен, частое явление. А чтоб блоки текста - тут уже может быть, а может не быть...
     
    Ладно, это всё лирика. Вам нужна программа (скрипт), которая делала бы следующее (распишу программную логику):
     
    1) Принимала на вход каталог с текстовыми файлами
    2) Создавала временный файл, конкатенируя эти файлы (с записью офсетов куда-нибудь в кэш / лог)
    3) "Линейно", либо с использованием специализированной библиотеки, искала повторяющиеся блоки текста, возвращая массив офсетов с найденными совпадениями (конкретная реализация может быть как "простейшей", так и "продвинутой", в зависимости от используемого модуля)
    4) Конвертировала найденные офсеты в оффсеты из кэша/лога, соотнося их с оригинальными, неконкатенированными файлами
    5) Выводила соответствующий результат.
     
    Трудности:
    1) Всё это дело написать
    2) В зависимости от объёма ваших данных и алгоритма поиска дубликатов, весь процесс может быть очень затратным в плане потребляемых ресурсов компьютера. Конкатенированный файл должен целиком находиться в оперативной памяти - здесь нет других вариантов. Точнее, есть, но они кратно усложнят реализацию - не уверен, что даже опытные программисты возьмутся за эту задачу.
     
    Возможно реализовать на:
    - из скриптовых языков точно подойдёт Python, JS под Nodejs, Perl. Всякая экзотика типа Ruby, тоже, вероятно, подойдёт.
    - по AutoIt/AutoHotKey лучше пояснит AZJIO, но что-то подсказывает, что узким горлышком будет производительность - AutoIt, по крайней мере, чрезвычайно медленный на больших объёмах данных. Работа с массивами - тоже не его конёк. Объектов, вроде, нет. Также, сомневаюсь, что под него удастся найти качественную специализированную под эту задачу (поиска дубликатов) UDF (модуль).
    - компилируемые языки. C, C++, Java, .NET, etc. - на них можно всё. Кто что знает, тот в том и работает.
     
    Ну и завершающий вопрос - при чём здесь регулярные выражения?..

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

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

    Цитата:
    В зависимости от объёма ваших данных и алгоритма поиска дубликатов, весь процесс может быть очень затратным в плане потребляемых ресурсов компьютера.  


    Цитата:
    по AutoIt/AutoHotKey лучше пояснит AZJIO, но что-то подсказывает, что узким горлышком будет производительность - AutoIt, по крайней мере, чрезвычайно медленный на больших объёмах данных.  

    Вы знаете? Я уже больше недели ВРУЧНУЮ с помощью PowerGREP вычищаю выборку из 700 файлов от повторяющихся фрагментов, содержащих только одно ключевое слово. Думаю, что  чтобы полностью вычистить её от повторящихся фрагментов у меня уйдёт месяца полтора.
     
    Поэтому даже если комп в автоматическом режиме сделает то же самое за неделю - это будет не медленно. Это будет называться "очень быстро"

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

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

    Цитата:
    выборку из 700 файлов

    Если вы ее выложите, то вам ее вычистят быстрее, чем вы будете ждать некоего спасительного решения. Или совершенно точно скажут, что ваш случай забесплатно (быстро) нерешаем.
    Если, конечно, вам ехать, а не шашечки.
    Потому что, если речь о текстовых файлах (любого типа), то вопрос идет о каких -то смешных количествах, ради которых разведен балаган, как будто нужно что-то сделать с бибилиотекой конгресса, которая еще не оцифрована.

    Всего записей: 1319 | Зарегистр. 17-01-2011 | Отправлено: 01:01 22-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

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


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru