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

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

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

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)
  • Игра - Регулярно выражайтесь!
     
    первое сообщение темы...
    Обсуждение шапки данной темы ведётся в этой теме
    Рекомендации по составлению вопросов в данной теме:

  • Всего записей: 32 | Зарегистр. 07-04-2002 | Отправлено: 23:55 15-10-2002 | Исправлено: totnetot, 05:23 27-08-2018
    obtim



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

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

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

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

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

    и т.д.

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

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

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

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

    Всего записей: 35 | Зарегистр. 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. - на них можно всё. Кто что знает, тот в том и работает.
     
    Ну и завершающий вопрос - при чём здесь регулярные выражения?..

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

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

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


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

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

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

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

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

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

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

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

    Цитата:
    Если вы ее выложите, то вам ее вычистят быстрее, чем вы будете ждать некоего спасительного решения.  

    Jonmey
    Не. Мне нужно именно универсальное законченное  решение.
    Потому что сегодня у меня одна выборка, завтра другая, после завтра - третья.
    Нужно именно законченное решение по фильрации не нужных и/или повтоярющихся фрагментов текста
     
    Добавлено:
    Нашёл тут программу (xMarkup), которая добавляет к REGEX дополнительный функционал путём поддержки  спец. языка текстовых перобразований ICON(UNICON).
    Поизучаю. Может там есть что полезное для решения моей задачи
     
    Добавлено:
    Подробнее...

    Всего записей: 35 | Зарегистр. 11-05-2019 | Отправлено: 12:51 22-05-2019
    U235

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

    Всего записей: 615 | Зарегистр. 14-12-2005 | Отправлено: 19:20 22-05-2019
    AZJIO



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    IvanStepanov
    Была бы задача понятна можно было бы пытаться её решить. Открыть файлы не проблема, грубо говоря перебрать 700 файлов в цикле, только что с ними делать-то? Я ранее спрашивал каждый файл = 1 кусок или в одном файле может быть 100 кусков. Как определить кусок, если у него начало и конец, или просто найти слово и искать его в тексте? Если найдено второе слово, то является ли оно принадлежащем одному куску или разным, что вырезать если найдено второе слово, если неизвестны границы куска? Можно же вырезать сразу 100 кусков или пол-куска, как определить что ты вырезаешь? А если при этом ещё и учесть что мы ищем вообще не слово (ограниченное пробелами), а некий текст, то предположим мы берём от начала 400 символов и ищем его повтор, далее 400-1 символов, то есть при каждом шаге уменьшаем на 1 символ и ищем повтор, дойдя до 8 символов вероятность повтора велика, допустим 2 символа попадётся дофига раз, итак где остановиться что считать совпадениями? После этого сдвигаем начало поиска на 1 от начала файла и повторяем 400 шагов. Но мы ещё не разобрались с предыдущими повторами, что к чему и куда их совать.
     
    Скачать - пример AutoIt3 (v3.3.8.1) скрипта. Положи его в папку, в которой нужно просканировать файлы, просто положи в тестовую папку с какими нибудь txt-файлами и запусти, получишь Log.txt в той же папке (сам откроется в конце поиска), посмотри содержимое. Меняй регулярное выражение, переписывай скрипт, он может выдать тебе тексты которые нашёл, а не только число совпадений. Пиши в цикле любой функционал, удаляй, заменяй найденное, копируй куда-нибудь файл, в общем придумывай сам. Русскую справку по AutoIt3 можешь скачать тут.

    Всего записей: 3885 | Зарегистр. 03-05-2006 | Отправлено: 20:54 22-05-2019 | Исправлено: AZJIO, 21:58 22-05-2019
    IvanStepanov

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

    Цитата:
    Была бы задача понятна можно было бы пытаться её решить.

    AZJIO
    Как это возможно?
    На последних 2-х страницах я разжевал уже всё до кашеобразного состояния.
    И не по одному разу.
    Может Вы просто не читали всё, что я писал?
     
    Нужно в массиве TXT-файлов найти все повторящиеся с точностью до пробельных символов фрагменты текста максимальной длины и удалить их сохранив только одну копию в отдельном файле коллекции.
     
     
    Вот и всё.
     
    Что тут может быть непонятно.
     
     
    Повторы ("копипаста") - это настоящая болезнь интернета, когда авторы воруют друг у друга целые куски текста
     
    Добавлено:

    Цитата:
    Как определить кусок, если у него начало и конец, или просто найти слово и искать его в тексте?

    AZJIO
    Я оказался прав. Вы точно не читаете, что я пишу.
     
    А ведь я писал, что в этом-то и проблема, что  границу между блоками выделить если не невозможно, то крайне затруднительно и лучше не тратить на это время а парсить вест текст сплошняком.
     
    Найти сначала маленькие повторяющиеся кусочки, затем наростить их и поискать совпадения, затем ещё наростить и так до максимума
     
    Добавлено:
    AZJIO
    А вообще спасибо Вам за желание помочь.
    Про AutoIT, AutoHotKey я тоже думал.
     
    С AutoHotKey  я даже довольно плотно работал лет 5 назад.
     
    Но пока решил поиграться с xMarkup и скриптами в ней на языке ICON.
     
    В рекламе говорится что это язык сверхвысокого уровня, предназначенный для разработки систем искусственного интеллекта для обработки текстов на естественных языках.

    Всего записей: 35 | Зарегистр. 11-05-2019 | Отправлено: 23:08 22-05-2019
    AZJIO



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

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

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

    Цитата:
    xMarkup
    глянул набор функций, пока не вижу, то что заставило бы меня изучать очередной язык, после AutoIt3 изучаю PureBasic, но в принципе мне и AutoIt3 хватает, единственное на PureBasic я могу писать плаги для NPP и писать в Linux, в остальном работу со строками можно написать, то есть написать строковую функцию которой изначально нет, это и есть "функция" или "процедура".

    Всего записей: 3885 | Зарегистр. 03-05-2006 | Отправлено: 23:59 22-05-2019 | Исправлено: AZJIO, 00:15 23-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

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

    Имя:
    Пароль:
    Сообщение

    Для вставки имени, кликните на нем.

    Опции сообщенияДобавить свою подпись
    Подписаться на получение ответов по e-mail
    Добавить тему в личные закладки
    Разрешить смайлики?
    Запретить коды


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

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.Board
    © Ru.Board 2000-2018

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru