| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Python: Общие вопросы > разбить строку на токены |
| Автор: volatile 22.2.2011, 01:22 | ||
| Python, изучаю недавно (всего несколько дней) Хочу написать небольшой парсер С++ файлов. *.cpp; *.h Нужно разбить строку на токены.
упрощенный вариант: пока идут символы A-Z;a-z;0-9;_ считается одним токеном как встретился другой символ, значит токен кончился. как это можно организовать. пока нашел только line.split(...), но там можно только один символ. |
| Автор: spSerg 22.2.2011, 10:03 |
| Вообще-то есть штатная батарейка: http://docs.python.org/library/tokenize.html Только боюсь, для cpp она не очень. |
| Автор: volatile 22.2.2011, 23:09 |
| spSerg, спасибо. Но этот действительно похоже только для исходников самого пайтона. Как я понял, нужно писать посимвольный ввод. Думал на пайтоне можно сделать проще... |
| Автор: spSerg 23.2.2011, 16:08 |
| Еще можно попробовать что-то помощнее. Например, ANTLR генератор парсеров: http://www.antlr.org/ а тут сама грамматика C++: http://www.antlr.org/grammar/cpp Только это решение не на чистом пайтоне получится. Тут либо большие решения, либо можно для отдельного подмножества случаев даже регулярками обойтись. Все зависит от задачи. Выбор за разработчиком. Удачи. |
| Автор: volatile 24.2.2011, 01:18 |
| spSerg, спасибо за ссылки. Но, вероятно, я не совсем корректно сформулировал вопрос. Упростим задачу. Отвлечемся от токенов и с++. Чистый пайтон. Допустим есть строка "abc,def;gty-klp" Как наиболее простым способом ее разбить на кортеж ("abc", "def", "gty", "klp") ? Символы разделители допустим могут быть такие: "<=>!&|^+-*/%:;(),~{}[]" |
| Автор: av0000 24.2.2011, 10:57 | ||
В такой постановке - элементарно
|
| Автор: volatile 24.2.2011, 23:49 | ||||
| av0000, в том виде как вы привели вообще не работает методом тыка удалось установить что еще '+' надо экранировать. В итоге программку удалось запустить в таком виде:
Но она ничего не делает. выход:
то есть как была строка так и осталась. дальше разбираться не стал... Добавлено через 10 минут и 9 секунд а, re это - regular expressions? в любом случае спасибо за наводку, av0000 |
| Автор: spSerg 25.2.2011, 09:16 | ||
| Ну не проверил человек. С кем не бывает В регулярке квадратные скобки забыл.
|
| Автор: av0000 25.2.2011, 11:42 | ||
| Угу... Перенабивал, поленившись копировать из консоли, — так не только квадратные скобки, а ещё и "лишнюю" группу "(.*?)" которая давала пустые строки (оттуда и коммент про пустые строки) забыл, вернее "удачно" убрал" ;) Изначальная строчка была print re.split(r"(*.?)[<=>!&|^+\-*/%:;()~{}[\],]+",s) В качестве компенсации офф-топика хочу поделиться наблюдением: Неспешно делаю очередную версию напоминалки об обновлениях на СамИздат-е с парсингом страничек и местами автоматическим конвертированием в .fb2... Так вот, тесты показали, что регекспы в 3-8 раз медленнее аналогичной реализации "руками" через startswith/find/endswith и т.п. Поэтому, если важна скорость обработки - стОит очень внимательно подумать что окажется выгоднее - медленный, "осмысленный" регэксп или 5-30 строк "ручного" кода. Для примера - вот те регекспы. До всякой оптимизации - попробовал "руками" и плюнул..
ЗЫ: Да и в сторону tokenize посмотреть не мешает... для более сложной грамматики, нежели разбивка по разделителям может оказаться проще, а то и быстрее... |
| Автор: volatile 25.2.2011, 23:11 |
| spSerg, av0000, Большое спасибо ребята! |