2017-12-23 4 views
0

Nehmen wir an, ich habe eine Python-Liste von Strings. Die Zeichenfolgen sind Tokens einer C++ - ähnlichen Sprache, die ich teilweise in Token umgewandelt habe. aber ich bleibe mit einigen Zeichenfolgen, die nicht in Token umgewandelt wurden. Das Problem, dass ich eine Reihe von Symbolen der Sprache habe, die ich in die Liste aufnehmen muss.Einen String unter Verwendung eines gegebenen Satzes von Delimitern teilen und sie einschließen

Beispiel:

class Test 
{ 
    method int foo(boolean a, int b) { } 
} 

Der Ausgang ich brauche, ist:

tokens = ['class', 'Test', '{', 'method', 'int', 'foo', '(', 'boolean', 'a', ',', 'int', 'b', ')', '{', '}', '}'] 

Der Ausgang ich, nachdem ich den Code aus Whitespaces reinigen erhalten:

tokens = ['class', 'Test', '{', 'method', 'int', 'foo(boolean', 'a,', 'int', 'b){', '}', '}'] 

Der Kodex ich verwende, ist verwendet eine Teilliste, die nach Leerzeichen aufgeteilt ist:

def tokenize(self, tokens): 
    """ 
    Breaks all tokens into final tokens as needed. 
    """ 
    final_tokens = [] 
    for token in tokens: 
     if not have_symbols(token): 
      final_tokens.append(token) 
     else: 
      current_string = "" 
      small_tokens = [] 
      for character in token: 
       if character in SYMBOLS_SET: 
        if current_string: 
         small_tokens.append(current_string) 
         current_string = "" 
        small_tokens.append(character) 
       else: 
        current_string += character 
      final_tokens = final_tokens + small_tokens 
    return final_tokens 

wo SYMBOLS_SET ist ein Satz von Symbolen:

SYMBOLS_SET = {"{", "}", "(", ")", "[", "]", ".", ",", ";", "+", "-", "*", "/", "&", "|", "<", ">", "=", "~"} 

und die Methode have_symbol (Token) liefert true zurück, wenn ein Symbol aus Token SYMBOL_SET und falsch sonst hat.

Ich denke, dass es eine elegantere Möglichkeit wäre, dies zu tun, würde ich mich für eine Führung freuen.

Antwort

1
import re 

input = r""" 
class Test 
{ 
    method int foo(boolean a, int b) { } 
}""" 

SYMBOLS_SET = {"{", "}", "(", ")", "[", "]", ".", ",", ";", "+", "-", "*", "/", "&", "|", "<", ">", "=", "~"} 

regexp = r"\s(" + "".join([re.escape(i) for i in SYMBOLS_SET]) + ")" 

splitted = re.split(regexp, input) 
tokens = [x for x in splitted if x not in [None, ""]] 

print(tokens) 

gibt Ihnen:

['class', 'Test', '{', 'method', 'int', 'foo', '(', 'boolean', 'a', ',', 'int', 'b', ')', '{', '}', '}'] 

Puttin parens um die Symbole sie eine regexp Untergruppe macht und damit in der Ausgabe erscheinen. Das \ s (Leerzeichen) wollen wir nicht enthalten.

Verwandte Themen