получить длину типа данных в python, анализируя строку - PullRequest
0 голосов
/ 18 декабря 2009

У меня есть строки вроде

uint8_t
char[5]
int[3]

Как написать короткую функцию для элегантного определения типа и длины отдельно

например

uint8_t // return 'uint8_t', '1'
char[5] // return 'char', '5'
...

Ответы [ 4 ]

3 голосов
/ 18 декабря 2009

Давайте сделаем его однострочным:

import re

def type_and_size(s):
    return re.split('[][]', s+'[1]', 2)[:2]

type_and_size('char')
['char', '1']

type_and_size('char[5]')
['char', '5']

Очевидно, что вы можете сделать:

type, size = type_and_size('char[5]')
0 голосов
/ 18 декабря 2009
import re

def parse_type(text):
     match = re.match(r'(.+)\[(\d+)\]', text)
     if match:
         return match.groups()
     return text, 1

print parse_type('uint8_t')
print parse_type('char[5]')
print parse_type('int[3]')
0 голосов
/ 18 декабря 2009

с учетом этих испытаний:

>>> s = "char[5]"
>>> p = s.split("[")
>>> p
['char', '5]']
>>> p[1].strip("]")
'5'
>>> s = "uint8_t"
>>> p = s.split("[")
>>> p
['uint8_t']
>>>

вот небольшая функция, которая дает вам то, что вы хотите:

def SplitNicely(s):
  p = s.split("[")
  if len(p) == 1:
    size = 1
  else:
    size = int(p[1].strip("]"))

  return p[0], size

дополнительная проверка ошибок также будет полезна

0 голосов
/ 18 декабря 2009
In [1]: import re
In [2]: r = re.compile('([\w_]+)(?:\[(\d+)\])?')
In [3]: m = r.match('char[5]')                                                                                                                                                        
In [4]: m.group(1), m.group(2) or 1
Out[4]: ('char', '5')
In [5]: m = r.match('uint8_t')
In [6]: m.group(1), m.group(2) or 1
Out[6]: ('uint8_t', 1)

Создание функции оставлено читателю в качестве упражнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...