Разница в синтаксисе. Описании. Как разница между C++ и Лиспом. К тому же самописный КА проще нагрузить дополнительными фичами. Тот же магазинный автомат не реализуется на регекспах нормально, с дополнительными затратами на время.
Вырезать html-форматирование из документа
Модераторы: /dev/random, Модераторы разделов
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Вырезать html-форматирование из документа
Разница в синтаксисе. Описании. Как разница между C++ и Лиспом. К тому же самописный КА проще нагрузить дополнительными фичами. Тот же магазинный автомат не реализуется на регекспах нормально, с дополнительными затратами на время.
-
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: Вырезать html-форматирование из документа
надеюсь, здесь присутствующие математики вас поняли.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Вырезать html-форматирование из документа
это только если вы регэкспы знаете намного хуже Qt.
именно так. к тому-же, что-бы выдрать ссылки из HTML вместе с md5 суммами (которые под тегом <code>) мне сегодня понадобилось 15 минут (какой-то движок странный, теги рвал неудачно по разным строкам, одним egrep'ом не отделаться было), то вот писать на Qt... Сначала надо вспомнить где у мну kDevelop, потом выяснится что там нет нужных либ и/или шаблонов, потом выяснится, что они есть, но не те (старые), потом надо искать/качать, потом... короче пол-дня... а потом это всё будет за собой тянуть чуть менее чем всё KDE?! увольте-с... Я понимаю - браузер делать, или хотя-бы файлокачалку... Но на такую разовую задачку?...
а... точно... у самого такой есть :)
вроде как в sed и реализован КА. а самих регэкспов в sed как раз и нет - она юзает те, что в glibc зашиты. хотя да, там что-то с детерминированным.. ну короче sed это один из самых ЯП, который ещё и полный к тому-же. Имеется как раз минимум:
1)команда перехода
2)команда условного перехода
3)одна переменная (а куда больше?)
4)ну и на всякий случай - команда прерывания.
Кстати, на рекурсивный разбор HTML тегов мне этого хватило, но код приводить не буду - тут sed конечно не слишком красиво выглядит (:
А регекспов в sed нету... Можете сами исходники глянуть...
и на sed не реализуется - она на очередь заточена, которая FIFO. просто команд таких нет - есть "оторвать голову", и есть "добавить в хвост" (:
-
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Вырезать html-форматирование из документа
Нет, не поняли. (:
Как можно всерьёз обсуждать разницу в синтаксисе, говоря об _абстрактном_ КА? Откуда вообще понятие "синтаксис" в этом контексте?
Что такое "магазинный автомат"?
Что Вы имеете ввиду под регэкспами? Строго говоря, даже s-выражения -- это уже не регэкспы. А уж тем более непонятна подразумеваемая прямая связь между регэкспами и языками sed или awk в целом.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Вырезать html-форматирование из документа
ну это к математикам, я тоже не понял (:
LIFO видимо...
согласен.
-
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Вырезать html-форматирование из документа
Вот я, как математик по образованию, автора и переспрашиваю.
Это терминология под влиянием старой шутки? "Автомат Калашникова -- это преобразователь стека в очередь"? Других ассоциаций между LIFO (стеком) и магазином у меня не возникает. (:
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Вырезать html-форматирование из документа
игра слов - "автоматный магазин". В АКМ'е он именно LIFO, это даже такой дембель из стройбата как я знает (:
-
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Вырезать html-форматирование из документа
Ну да, я примерно о том и говорю. Это и я знаю, хотя в армии не служил по состоянию здоровья.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Вырезать html-форматирование из документа
Я просто не думаю, что сразу получится предусмотреть все случаи. Конечно, если практика регекспов велика, то да...
Ну, так речь шла о регекспах. Я с sed не очень много работал. Мне проще perl -e '...'

Самый простой. Вход - сама строка. Выход - текст без разметки. Состояния свитчем, дуги тоже свитчем. Что-то типа (это псевдо-код):
Код: Выделить всё
enum states { text, tagname, tagspace, attr, attris, attrvalue, attrquote... };
std::stack< char > st;
std::string tagName;
states state = text;
for( char c = next_char(); c; c = next_char() ) {
switch( state ) {
case text:
switch( c ) {
case '<':
state = tagname;
tagName = "";
break;
default:
printf( "%c", c );
break;
}
break;
case tagname:
switch( c ) {
case ' ': case '\t':
state = tagspace;
break;
default:
tagName += c;
break;
}
break;
...
case attris:
switch( c ) {
case '\'': case '"':
stack.push( c );
state = attrquote;
break;
case ' ': case '\t':
break;
default:
state=attrvalue;
break;
}
break;
case attrquote:
if( c == stack.top() ) {
....
}
break;
...
}
}
drBatty правильно ответил:
Не знаю под чьим влиянием, но она общепризнанная. И на дискретке мы их учили именно под таким названием.
http://ru.wikipedia.org/wiki/Автомат_с_магазинной_памятью
Не очень знаком с sed, вообще не знаком с awk. Сужу о регекспах по perl в основном. На одних регекспах в такой задаче сидеть неудобно. О катастрофическом падении скорости в некоторых случаях знаком не по наслышке.
PS я не спорю, что регекспы великая вещь. Сам их частенько использую. Но считаю, что в данной задаче вот такие вот свитчи проще, прозрачнее и надёжнее (не будет провалов по скорости).
-
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Вырезать html-форматирование из документа
И какое это имеет отношение к моему вопросу о синтаксисе? Эти "свитчи" -- КА? Отлично, но sed -- тоже КА; и awk. Разница в "синтаксисе" между всеми тремя весьма велика.
А, так и надо было сказать: "с магазинной памятью". Всё было бы понятно. А сокращение "магазинный автомат" я слышу впервые.NickLion писал(а): ↑01.06.2010 22:08Не знаю под чьим влиянием, но она общепризнанная. И на дискретке мы их учили именно под таким названием.
http://ru.wikipedia.org/wiki/Автомат_с_магазинной_памятью
Видимо, в этом всё дело. (: У меня и сложилось впечатление, что Вы не совсем понимаете, о чём говорите. Извините за прямоту.
На одних регэкспах в такой задаче "сидеть" не то что неудобно, а невозможно. Как я уже говорил, s-выражение -- это уже не регэксп. С натяжкой "одними регэкспами" можно назвать, скажем, голый pcregrep; но он с задачей справится лишь в одном случае: если html не только написан без особых нарушений структуры разметки (незакрытых тегов, например), но и хоть как-то отформатирован.
В такой задаче проще и прозрачнее "такие свитчи" базировать не на посимвольном разборе, а как раз на регэкспах, и даже чуть более -- на s-выражениях. Что, собственно, приведенный drBatty пример на sed и демонстрирует. (: Провалы по скорости (и памяти) будут, если пытаться загонять в s-выражения слишком сложные конструкции; говоря о pcre, если использовать "нежадные" квантификаторы; и т.п. Если же s-выражения грамотно комбинировать с управляющими конструкциями, то как раз по скорости может выйти даже эффективнее, чем посимвольный разбор.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Вырезать html-форматирование из документа
Ну, я к тому, что данный код больше походит на КА в классическом понимании. Вход, множество состояний, и переходов между ними. Синтаксис регекспов всего этого не содержит. Разве не ответ на вопрос о синтаксисе?
Извиняюсь, строгость терминологии у меня бывает страдает.
Можете не извиняться


t.t писал(а): ↑02.06.2010 08:22На одних регэкспах в такой задаче "сидеть" не то что неудобно, а невозможно. Как я уже говорил, s-выражение -- это уже не регэксп. С натяжкой "одними регэкспами" можно назвать, скажем, голый pcregrep; но он с задачей справится лишь в одном случае: если html не только написан без особых нарушений структуры разметки (незакрытых тегов, например), но и хоть как-то отформатирован.
Вот, видимо всё от непонимания. Я подразумевал применение s/.../.../[ig] последовательно несколько раз. Без применения дополнительных средств.
Для уверенности - имеется в виду s/.../.../ ? Или http://ru.wikipedia.org/wiki/S-выражение ?
t.t писал(а): ↑02.06.2010 08:22В такой задаче проще и прозрачнее "такие свитчи" базировать не на посимвольном разборе, а как раз на регэкспах, и даже чуть более -- на s-выражениях. Что, собственно, приведенный drBatty пример на sed и демонстрирует. (: Провалы по скорости (и памяти) будут, если пытаться загонять в s-выражения слишком сложные конструкции; говоря о pcre, если использовать "нежадные" квантификаторы; и т.п. Если же s-выражения грамотно комбинировать с управляющими конструкциями, то как раз по скорости может выйти даже эффективнее, чем посимвольный разбор.
Согласен, что может выйти эффективнее. Я просто хотел максимально сохранить близость с "классическим" описание КА.
-
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Вырезать html-форматирование из документа
Синтаксис последовательных s-выражений (в терминологии perl/sed, а не ФП, это Вы правильно уточнили) именно это и содержит. Только под входом здесь нужно понимать весь текст в целом.
Пропустил, видимо. Да, если именно чистые регэкспы упоминались как инструмент обработки разметки (а не как лишь один из элементов такого инструмента), то это инструмент очень ограниченный.
Имеется ввиду первое, я пояснил немного выше. Это действительно больше, чем регэксп.NickLion писал(а): ↑02.06.2010 09:56Вот, видимо всё от непонимания. Я подразумевал применение s/.../.../[ig] последовательно несколько раз. Без применения дополнительных средств.t.t писал(а): ↑02.06.2010 08:22На одних регэкспах в такой задаче "сидеть" не то что неудобно, а невозможно. Как я уже говорил, s-выражение -- это уже не регэксп. С натяжкой "одними регэкспами" можно назвать, скажем, голый pcregrep; но он с задачей справится лишь в одном случае: если html не только написан без особых нарушений структуры разметки (незакрытых тегов, например), но и хоть как-то отформатирован.
Для уверенности - имеется в виду s/.../.../ ? Или http://ru.wikipedia.org/wiki/S-выражение ?
А обработка на sed тоже подходит под это описание, как я уже сказа выше: под входом только нужно понимать не символ, а весь текст или как минимум строку. В классическом примере ведь тоже не символы, а биты используются, для простоты. Так что строка или текстовый поток в целом -- всего лишь следующий уровень "расширения" в цепочке бит-символ. (;NickLion писал(а): ↑02.06.2010 09:56Согласен, что может выйти эффективнее. Я просто хотел максимально сохранить близость с "классическим" описание КА.t.t писал(а): ↑02.06.2010 08:22В такой задаче проще и прозрачнее "такие свитчи" базировать не на посимвольном разборе, а как раз на регэкспах, и даже чуть более -- на s-выражениях. Что, собственно, приведенный drBatty пример на sed и демонстрирует. (: Провалы по скорости (и памяти) будут, если пытаться загонять в s-выражения слишком сложные конструкции; говоря о pcre, если использовать "нежадные" квантификаторы; и т.п. Если же s-выражения грамотно комбинировать с управляющими конструкциями, то как раз по скорости может выйти даже эффективнее, чем посимвольный разбор.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Вырезать html-форматирование из документа
всё это прелестно ложится на sed-скрипт. единственная сложность - это то, что sed обрабатывает файл построчно, а в HTML понятие "строка" не имеет смысла. В C++ с этим тоже будет сложности (в STL). Обычно в память грузят весь текст целиком, а потом выкидывают код на помойку, и юзают чужой парсер, потому-что он "быстрее". (:
падение скорости связано с двумя причинами:
1) из-за слишком сложных перловых RE. В sed такой проблемы нет - там нет PCRE. в awk тоже - там их вообще нет. (:
2) неправильной работой с памятью. Загрузить огромный файл целиком в память, а потом ковырять его потоковым редактором - плохая идея. В sed есть эффектные методы работы с такими потоками (команды P, N, D). А вот про perl - не знаю...
ага.
Код: Выделить всё
#!/bin/sed
/</{
# обработка тегов
}
/<!--/{
# обработка комментов
}
... и т.д.
и где тут регекспы?
тут как раз C++ не пойдёт, там нельзя case '<!--':
ага. только тут RE нужны несколько для другого - например для поиска "<!--". Не, вы конечно можете написать свою реализацию метода SHIFT-AND, только какой в этом смысл, если в нашей glibc УЖЕ это есть? Причём вовсе не обязательно использовать STL обёртку, и городить свой код, есть уже готовая обёртка - sed.
Падение скорости будет только если вы зачем-то применили например скобки (вроде того, что-бы найти то, что три раза уже было), в данной задаче это не нужно, а нужен простой поиск. И реализация из glibc будет намного быстрее, чем посимвольный разбор. К тому-же она места не занимает, и всегда есть.
в sed(и в perl) это не просто RE. Просто RE просто ищет некоторое выражение в некотором тексте, и выдаёт результат: позиции начала и конца совпадений. команда s делает намного больше, она не только ищет, но и заменяет(или НЕ заменяет) совпадения. А иногда даже преобразует текст для замены (может сменить регистр, или отправить текст оболочке).
а в sed оно и будет ближе. C++ не умеет выбирать строчки, а только целые числа (switc-case). Потому ваш КА в C++ ляжет очень криво, на кучу if-ов. В отличие от sed.
t.t писал(а): ↑02.06.2010 12:04А обработка на sed тоже подходит под это описание, как я уже сказа выше: под входом только нужно понимать не символ, а весь текст или как минимум строку. В классическом примере ведь тоже не символы, а биты используются, для простоты. Так что строка или текстовый поток в целом -- всего лишь следующий уровень "расширения" в цепочке бит-символ. (;
в исходной задаче у нас есть "подстроки". биты, байты и даже символы нам не подходят по условию. Причём подстроки ещё и не имеют жёсткого формата, даже самый простой тег <br> может быть записан например как <br
/>
потому в этой задаче RE понадобятся в любом случае, без них всё будет слишком сложно, медленно и криво.
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Вырезать html-форматирование из документа
ЗЫЖ уточнение:
не, есть там RE. они нужны в том случае, если нет libc. Например если мы собираем sed для Windows (странная ось - там даже регекспов нет...)
LIFO тоже можно сделать конечно... вот только это жутко долго. Т.е. если сравнить FIFO из sed с другой реализацией - то в sed не хуже, а вот LIFO на sed - намного хуже...
не, есть там RE. они нужны в том случае, если нет libc. Например если мы собираем sed для Windows (странная ось - там даже регекспов нет...)
LIFO тоже можно сделать конечно... вот только это жутко долго. Т.е. если сравнить FIFO из sed с другой реализацией - то в sed не хуже, а вот LIFO на sed - намного хуже...