регулярные выражения в Content Downloader

Тема в разделе "Функции и интерфейс программы", создана пользователем nikolas1612, 11 авг 2012.

  1. nikolas1612

    nikolas1612 Member Пользователи

    Регистрация:
    27 ноя 2011
    Сообщения:
    439
    вот фразы из мануала:

    re:В.*З|автоваз
    - будут искаться все выражения с В в начале и с З на конце. Например: ВАЗ, ВОЗ, Волшебный таЗ

    Для замены куска текста с динамической серединой используется регулярное выражение .*. Например, если нужно заменить все теги ссылок, ведущие на определенный сайт, в функцию поиск-замены введем следующую строку:
    re:<a href="http://site.ru.*</a>|123
    Где 123 – текст, на который будут заменены все ссылки ведущие на site.ru.

    честно говоря, не понимаю, чем это отличается от макроса {skip}. поправьте меня, если я ошибаюсь - но в обоих случаях тот же результат будет получен так:
    re:В.*З|автоваз = В{skip}З|автоваз
    re:<a href="http://site.ru.*</a>|123 = <a href="http://site.ru{skip}</a>|123

    итого вопрос: зачем в программе регулярки, если они являются полным дублем макроса {skip}?
     
  2. Valiks

    Valiks New Member Супер Модератор

    Регистрация:
    18 янв 2012
    Сообщения:
    554
    Адрес:
    Всё время в скэйпе
    Регулярные выражения имеют более широкий спектр действий, чем показаное вами (.*). Кроме всего, в программе макросы могут использоваться в разных местах. В частности не в каждом поле "поиск-замена" сработает регулярка, тогда будет работатьт макроса {skip} или другой. Самое важное,- макроса {skip} используется там, где регулярные выражения нельтзя вставить, например в "настройках границ парсинга". Ну и так далее, что является уже секретом создателя программы.

    Наверное надо ещё раз повторить,- вы получили в руки инструмент, и только от вашего умения и смекалки зависит насколько эффективно и как много вы из него выжмете.

    Любознательность, конечно же, хорошее дело, вопросы задавайте, где возможности ответим в меру способностей и знаний.
     
  3. nikolas1612

    nikolas1612 Member Пользователи

    Регистрация:
    27 ноя 2011
    Сообщения:
    439
    наверно, и мне стоит перефразировать вопрос.

    можно ли сделать регуляркой то, чего нельзя сделать макросом {skip}? хотя бы один пример.
     
  4. Valiks

    Valiks New Member Супер Модератор

    Регистрация:
    18 янв 2012
    Сообщения:
    554
    Адрес:
    Всё время в скэйпе
    Преподать урок по регулярным выражениям? Я не специалист в этой области, однако, если вы понимаете смысл термина "пропустить" {skip}, и сможете противопоставить всё остальное многообразие возможных вариантов действий, может быть найдёте ответ и на ваш вопрос. Макрос {skip} решает всего ОДНУ задачу, регулярные выражения способны решить сотни тысяч. В чём вопрос тогда?
     
  5. kagorec

    kagorec Администратор Команда форума Администратор

    Регистрация:
    3 янв 2011
    Сообщения:
    4.054
    Город:
    Riga
    Ссылки недоступны для гостей, зарегистрируйтесь или авторизуйтесь на форуме! пару примеров
    И почитайте больше про Ссылки недоступны для гостей, зарегистрируйтесь или авторизуйтесь на форуме!
     
  6. nikolas1612

    nikolas1612 Member Пользователи

    Регистрация:
    27 ноя 2011
    Сообщения:
    439
    вопрос был, наверно, из категории "чайника". но это моя категория. я не разбираюсь в программировании, скриптах, кодах и проч.
    по примерам в хелпе создавалось впечатление, что функциональность {skip} и .* идентична на 100%.
    потому и спросил.
    спасибо за ответы. особенно за последний.
    странно, не видел эту статью в хелпе СД.. по крайней мере, в таком виде. доработали ее, что ли?
    в общем, вопрос закрыт, можно двигаться дальше. :)
     
  7. Valiks

    Valiks New Member Супер Модератор

    Регистрация:
    18 янв 2012
    Сообщения:
    554
    Адрес:
    Всё время в скэйпе
    В этом, частном случае идентична, но регулярные выражения используют не только точку и звёздочку.
     
  8. nikolas1612

    nikolas1612 Member Пользователи

    Регистрация:
    27 ноя 2011
    Сообщения:
    439
    к сожалению, тема не закрыта... получил начальные знания о регулярных выражениях в PHP.. и столкнулся с тем, что большинство составленных мною выражений не работают. включая простейшие, в которых я навряд ли ошибся.

    в этой связи, вопрос: понимает ли программа сложные регулярки? при наличии ограничений - прошу разъяснить, какие конкретно метасимволы, квантификаторы, спецсимволы и модификаторы в ней можно использовать.

    P.S. уж не взыщите, если снова вопрос в стиле "чайника".
    P.P.S. модификаторы точно не работают...
     
    Последнее редактирование: 16 авг 2012
  9. Valiks

    Valiks New Member Супер Модератор

    Регистрация:
    18 янв 2012
    Сообщения:
    554
    Адрес:
    Всё время в скэйпе
    Вопрос правильный, это хорошо, что интересуетесь. Спрашивать не возбраняется, наоборот,- приветствуется. Но, языков регулярных выражений очень много, и в каждом свои заморочки. Часто, надо совмещать один вариант с другим. Но, это всё слова. Практика показывает, и я уже говорил об этом, что в Content Downloader-е регулярки используются крайне редко ввиду того, что практически любые задачи можно решить стандартными средствами Content Downloader-а. Кроме всего, программа не настроена на замены простых функций, более сложными, типа регулярных выражений. Если всё решается без них, зачем нужны ещё и регулярки?

    Но, давайте перейдём от слов к делу. Покажите те примеры, с которыми вы столкнулись. Только объясните внятно, что пытались делать и как.
    - Приведите ссылки откуда пытались парсить,
    - какие применяли настройки,
    - лучше приложите проект, и
    - опишите чего хотели получить,
    - что получили, и
    - что не получилось

    Так будет проще, чем говорить на пальцах
     
  10. perplexor

    perplexor New Member Пользователи

    Регистрация:
    16 авг 2012
    Сообщения:
    20
  11. nikolas1612

    nikolas1612 Member Пользователи

    Регистрация:
    27 ноя 2011
    Сообщения:
    439
    суть проблемы вот в чем. после отбора искомых новостей я их укорачиваю и свожу воедино. для этих целей подходит 2 варианта - 1). макрос "short" обрезающий новость после n-ного количества символов на точке, вопросительном или воскл. знаке, либо обрезка новости по n-ной точке. все бы хорошо, за исключением одного НО:
    часто последняя обрезка происходит вот в таком месте:
    ... г. Севастополь ...
    ... М. Дубинин ....
    .. 345 кв. м ..
    т.е. это середина предложения!! такие случаи приходится править вручную.

    что хотел сделать регуляркой - сделать так, чтобы новость резалась именно в конце предложения.
    по моему разумению, для этого надо: найти и удалить последнее предложение в htm-файле, если оно оканчивается на:
    Одиночную заглавную букву с точкой на конце.
    Две или одну строчных буквы с точкой на конце.
    По логике, программе надо еще и как-то дать понять, где начало такого предложения. Чтоб она не обрезала в таком же месте..

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

    неожиданно все получилось. и именно с помощью данного сервиса. с этими регулярками можно просто чудеса творить.
    решил так: в поиск-замену для основного кода введена конструкция регулярного выражения -
    ([^ 0-9]{4,}[.](\s{sep}<.{1,4}>))|$1<tdot>
    при помощи нее в места, где перед точкой имеется как минимум 4 непробельных и нецифровых символа, а после точки стоят пробел либо теги - обозначаются тегом <tdot>. это и есть границы реальных предложений. дальше парсим по ним необходимое количество предложений.
    всем спасибо.
     
    Последнее редактирование: 18 авг 2012
  12. Valiks

    Valiks New Member Супер Модератор

    Регистрация:
    18 янв 2012
    Сообщения:
    554
    Адрес:
    Всё время в скэйпе
    Это уже реализовано в программе. Смотрите подсказки к макросам, которыми пользуетесь. Макрос о котором вы говорите имеет опции
    Это простой вариант
    <SHORT len="250" //></SHORT>
    Если необходимо, чтобы обрезка шла по какому-то знаку, добавляете его отдельно, например, так:
    <SHORT len="250" end="?|.|!" //></SHORT>
    Если нужно несколько знаков, разделяйте их вертикальной чертой

    Как видите, придумывать ничего не нужно, всё уже продумано и придумано

    уже не нужен

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

    Кстати, если есть интересные решения по регуляркам и не жалко поделиться с другими,- выкладывайте, многие будут благодарны. Правда, выражать благодарность на этом форуме не научились, но в душе, все благодарны за любую помощь или подсказку.
     
  13. nikolas1612

    nikolas1612 Member Пользователи

    Регистрация:
    27 ноя 2011
    Сообщения:
    439
    уважаемый Valiks! я все это знаю.. Вы просто слишком бегло прочитали мое сообщение. ;) приведенный Вами пример дает обрезку на точке, и только. как раз этого мне и мало! суть проблемы в том, НА КАКОЙ КОНКРЕТНО точке происходит обрезка. потому что эта точка - далеко не всегда совпадает с логическим концом предложения.
    вот живой пример работы макроса "short" -
    100 тыс. чего???? предложение явно не имеет логического конца. заметьте, я даже не искал.. такое с макросом "short" случается сплошь и рядом.

    да и режу я новости не им, а по точке №7. методом научного тыка установлено, что в 5-7 предложений, как правило, укладывается весь смысл новости, независимо от ее символьной длины.

    опять же, может, я чего-то не знаю? я уже неоднократно обращался к автору напрямую с просьбой предусмотреть возможность автоматического парсинга с жесткого диска, но, насколько мне известно, такая функция еще не реализована.. слово "автоматического" в данном случае означает - не добавлять файлы с жесткого диска вручную, а поставить такой проект в один ряд с другими проектами - чтобы он автоматически запускался в планировщике. т.е. первый проект в очереди накачал файлы, а второй - сразу эти же файлы по определенной схеме обработал и отсортировал..
    на сегодняшний день, это можно реализовать запуском встроенного в ОС web-сервера. других вариантов не знаю. если подскажете - буду бесконечно признателен.
     
  14. Valiks

    Valiks New Member Супер Модератор

    Регистрация:
    18 янв 2012
    Сообщения:
    554
    Адрес:
    Всё время в скэйпе
    Я показал вариант <SHORT len="250" end="?|.|!" //></SHORT>, который обрезает по трём символам,- ? . !. Да, конечно, может случиться так, что предложение обрежется на точке, идущей после имени или после 100 тыс.. Ну и что? проставьте взад этому предложению троеточие, и никто не заподозрит вас в том, что вы неправильно или неумело провели обрезание. Лично мне, всё это не кажется большим неудобством, может быть потому, что я имею дело с текстами, в которых обрезание делается по другим признакам, например, по окончанию абзаца. Но и тут масса проблем.

    Я уже не раз говорил, программа специализированная, её дело ПАРСИТЬ, а не обрабатывать тексты, и, тем более, не постить. Для этого существуют другие тоже специализированные программы, задача которых обрабатывать и постить. Например, тот же Зеброид или TextKit.
     
    Последнее редактирование: 18 авг 2012
  15. nikolas1612

    nikolas1612 Member Пользователи

    Регистрация:
    27 ноя 2011
    Сообщения:
    439
    похоже на то, что в регулярках программы не работает функция позитивного просмотра (конструкция типа (?=хххххх) и ей подобные)
    чтоб сразу было ясно, о чем я говорю, цитата из Википедии:
    собственно, суть вопроса: в программе нет работает конструкция, которая отлично срабатывает на сервисе Ссылки недоступны для гостей, зарегистрируйтесь или авторизуйтесь на форуме! , а между тем именно его в мануале CD рекомендуют для проверки составленных регулярных выражений. как-то... странно. такое вообще может быть, или такая ситуация заведомо означает что я где-то ошибся?
     
  16. Valiks

    Valiks New Member Супер Модератор

    Регистрация:
    18 янв 2012
    Сообщения:
    554
    Адрес:
    Всё время в скэйпе
    Смотрите на мир проще,- человек не может всё предусмотреть. Надо как-то продумать какие нововведения относительно регулярных выражений можно было бы ввести в Content Downloader и сделать граммотное предложение по улучшению программы. Сергей прекрасный парень, делает всё возможное, чтобы программа становилась всё лучше.

    Говорят, не ошибается только Бог. Не ищите виноватых, лучше ищите решение. Регулярные выражения штука капризная, там вряд будет когда-либо абсолютная ясность. В некоторых программах приходиться работать регулярками очень многое, и постоянно натыкаюсь на неразрешимые задачи: случаи вроде бы идентичные, а регулярки приходиться составлять совершенно разные.

    RegExr не может решать все поставленные перед ним задачи. Слишком часто сталкивался с тем, что формула отлично работающая в RegExr не работала в других программах, таких как TextKit, Zebroid, Zennoposter. Так и наоборот, были формулы которые работали в этих программах, но не работали RegExr. И что ещё интереснее, были формулы, которые работали везде, а были такие, которые срабатывали выборочно, то в одной, то в другой программе. Я не мастак в регулярках, поэтому обращался к специалистам за советом, мне сказали просто: "не парься и не ищи ответов,- просто пробуй варианты, пока не найдёшь нужный". Такой ответ встречал на многих сайтах программистов, причём там возмущение шло и на Notepad++ в котором что-то работает, а что-то нет, и на другие проги. Например, в Тотал Коммандере, тоже есть регулярки, так в каждом случае там срабатывают формулы, взятые из разных источников. Я стал поступать по-простому,- сохраняю удачные формулы, чтобы на будущее не потеть мозгами. К сожалению, в регулярных выражениях нет единства формул, это приводит к тому, что как бы хорошо вы ни знали регулярки, в каждом новом случае приходиться изобретать Америку. Что делать? Дерзать.
     
  17. nikolas1612

    nikolas1612 Member Пользователи

    Регистрация:
    27 ноя 2011
    Сообщения:
    439
    ну... вот, к примеру, любопытная штука.. удаляет дублирующиеся части текста (и не только), если htm-статья постоена по принципу - пара предложений в виде анонса и далее - повторяющий их основной текст..
    [REPLACE(
    re:^(.{30,})(.*?)\1(.*)|$1$3
    re:^(.{30,})(.*?)\1(.*)|$1$3
    )]...................[/REPLACE]

    вот результат (выделенное жирным удаляется):
    если слишком примитивно - сорри, я толь ко учусь ;)
     
  18. Valiks

    Valiks New Member Супер Модератор

    Регистрация:
    18 янв 2012
    Сообщения:
    554
    Адрес:
    Всё время в скэйпе
    Я что-то не понял, что тут дублируется, что удаляется? Кто удаляет? Я не вижу дублей, не понял, относительно выделенного с чего это вдруг оно удаляется и зачем?
     
  19. nikolas1612

    nikolas1612 Member Пользователи

    Регистрация:
    27 ноя 2011
    Сообщения:
    439
    а вы присмотритесь. выделенное жирным полностью дублируется в остальном тексте.
    эта штука понадобилась мне для очистки новостного дайджеста, в который сведены десятки новостей. в нем не нужны повторяющиеся предложения, он и так большой.
    регулярка чистит строку по принципу: если строка начинается с 30 и более символов, которые повторяются дальше по тексту, то часть текста между этими символами и до совпадающего с ними фрагмента (включая его) удаляется. я их поставил вообще 2 подряд, на случай, если предложение повторяется 3 раза (бывало и такое).

    вот пример новости в которой есть "дубль" -
    Ссылки недоступны для гостей, зарегистрируйтесь или авторизуйтесь на форуме!

    дублирующиеся фразы:
    Главной сенсацией футбольного дня 18 августа стало поражение киевского «Динамо» в Полтаве от местной «Ворсклы» 0:1. Тем временем, «Металлист» в Ужгороде разгромил «Говерлу» 3:0. Ничьи были зафиксированы в матчах «Кривбасс» - «Днепр» (0:0) и «Металлург Д» - «Таврия» (1:1). И в первом матче 6-го тура «Арсенал» обыграл «Ильичевец» 2:1. Фото obozrevatel.com Главной сенсацией футбольного дня 18 августа стало поражение киевского «Динамо» в Полтаве от местной «Ворсклы» 0:1. Полтавчане воспользовались одним из немногих своих моментов, в то время, как полуторный состав киевлян — свои не реализовал. Тем временем, «Металлист» в Ужгороде разгромил «Говерлу» 3:0. Ничьи были зафиксированы в матчах «Кривбасс» - «Днепр» (0:0) и «Металлург Д» - «Таврия» (1:1). И в первом матче 6-го тура «Арсенал» обыграл «Ильичевец» 2:1.


    после обработки станет так:
    Главной сенсацией футбольного дня 18 августа стало поражение киевского «Динамо» в Полтаве от местной «Ворсклы» 0:1. Полтавчане воспользовались одним из немногих своих моментов, в то время, как полуторный состав киевлян — свои не реализовал. Тем временем, «Металлист» в Ужгороде разгромил «Говерлу» 3:0. Ничьи были зафиксированы в матчах «Кривбасс» - «Днепр» (0:0) и «Металлург Д» - «Таврия» (1:1). И в первом матче 6-го тура «Арсенал» обыграл «Ильичевец» 2:1.

    для дайджеста - самое оно. алгоритм стремный (может нарезать лишнего) но пока что работает безотказно.
     
    Последнее редактирование: 21 авг 2012
  20. Valiks

    Valiks New Member Супер Модератор

    Регистрация:
    18 янв 2012
    Сообщения:
    554
    Адрес:
    Всё время в скэйпе
    Теперь понятно. Просто в первом примере из жирного текста повторялось только часть фразы, вот и непонятно было. Хорошее дело. Надо будем подумать, может быть предложить автору такой вариант улучшения программы ввести новую функцию? Интересно, где, кроме новостей оно применимо?
     

Поделиться этой страницей