2009-12-17 4 views
0

J'ai des chaînes commeobtenir la longueur du type de données en python par l'analyse d'une chaîne

uint8_t 
char[5] 
int[3] 

Comment puis-je écrire une courte fonction pour obtenir le type et la longueur séparément d'une manière élégante

pour par exemple

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

Utilisez-vous python pour analyser une autre langue (peut-être C++)? – Seth

+0

non. Juste ces chaînes et mon propre fichier de définition – randomThought

Répondre

3

Faisons une ligne:

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'] 

Évidemment, vous pouvez faire:

type, size = type_and_size('char[5]') 
0
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) 

Faire une fonction est laissé comme un exercice au lecteur.

0
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

Compte tenu de ces essais:

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

est ici une petite fonction qui vous donne ce que vous voulez:

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

    return p[0], size 

plus la vérification des erreurs serait utile aussi

+0

C'est une sorte de façon secondaire de le faire. Je cherchais une solution appropriée élégante comme un doublure ou similaire – randomThought

Questions connexes