С разбиением файла в Python? - PullRequest
       19

С разбиением файла в Python?

0 голосов
/ 07 августа 2011

Я работаю над диссертацией по файлам C.Мне нужно разделить заголовок C, чтобы потом манипулировать одиночными словами, составляющими его.Я должен разделить строки по всем этим символам:

  1. Пробелы и табуляции
  2. Новые строки ; или \n
  3. Однострочные и многострочные комментарии // /* */
  4. Указатели *
  5. Массивы в скобках [] или [dimension]

Так, например, если у меня есть эти несколько строк:

/* This is a
   multiline comment.
*/

typedef int rocket;

// This is a single line comment.
typedef double* pi[10];

функция split должна возвращать список (или все остальное) следующим образом:

["/*","This","is","a","\n","multiline","comment.","\n","*/","\n","\n","typedef","int","rocket",";","\n","\n","//","This","is","a","single","line","comment.","\n","typedef","double","*","pi","[10]",";"]

И это должно быть сделано в Python!

Я пробовал это, но моймало знаний о регулярных выражениях подсказывает мне, что я нашел ужасное решение !!:)

Спасибо, Дарио.

Ответы [ 3 ]

4 голосов
/ 07 августа 2011

Возможно, вам стоит подумать о pycparser .(Не зная, что вы на самом деле делаете, я не могу сказать больше, извините)

1 голос
/ 13 августа 2011

У вас есть синтаксический анализатор, который сделан для работы, которую вы хотите.Вы можете найти их список здесь: http://wiki.python.org/moin/LanguageParsing Это облегчит вашу жизнь.

0 голосов
/ 07 августа 2011

Вы можете использовать re.split, чтобы получить то, что вы хотите:

c_code = """
/* This is a
   multiline comment.
*/

typedef int rocket;

// This is a single line comment.
typedef double* pi[10];
"""

import re

def split_c(c_code):
    tok_re = r"(\n)|\s|(;|/\*|//|\*/|\*|\[\d*\])"
    return [t for t in re.split(tok_re, c_code) if t]

print split_c(c_code)

Это дает:

['\n', '/*', 'This', 'is', 'a', '\n', 'multiline', 'comment.', '\n', '*/', 
'\n', '\n', 'typedef', 'int', 'rocket', ';', '\n', '\n', 
'//', 'This', 'is', 'a', 'single', 'line', 'comment.', '\n', 
'typedef', 'double', '*', 'pi', '[10]', ';', '\n']

Обратите внимание, что по мере того, как ваши требования становятся более сложными (я беспокоюсь, что [10] пример действительно должен быть более сложным, например), этот метод, возможно, должен быть полностью заменен.

...