2016-07-28 13 views
0

'Hallo, SO-Community.Der beste Weg, um Copy-Paste und Hardcoding zu vermeiden

Problem: Ich habe viele REGEX Muster, wie

r'to.*school', r'built.*in' 

und etc. In jedem Fall habe ich einen Code ausführen sollte, dass von Situation zu Situation unterschiedlich.

Beispiel: Wenn Muster ‚zu * Schule.‘ Ich mag das Verb finden, bevor ‚zu‘ und das ist, warum ich etwas schreiben wie:.

for num, part in enumerate(sentence): 
    if part == 'to': 
     result = sentence[num-1] 

Wenn Muster ‚gebaut * in', mag ich die Zeit zu finden, und deshalb schreibe ich so etwas wie:

for num, part in enumerate(sentence): 
    if part == 'in': 
     result = sentence[num+1] 

Also das Problem gibt es - wie kann ich copy-Einfügen von Code, wenn es mehr als 500 Muster und jedes Muster hat seine eigene Art und Weise vermeiden um ein Ergebnis zu erhalten?

Meine Gedanken: Ich verstehe, es sollte eine Art von Datenbank sein, die Muster und Lösungen speichert, aber wie führe ich Lösung, wenn es eine Zeichenfolge ist? Ich bin total verloren.

+0

Können Sie ein Beispiel für "Satz" und Ihre gewünschte Ausgabe zeigen? –

+0

Ich würde eine Tabelle einführen, die in der ersten Spalte die Muster und in der zweiten eine Referenz auf eine geeignete Methode enthält. – Humbalan

+0

@Chris_Rands natürlich. 'origSentence = 'Ich gehe zur Schule'; Muster = r'to. * Schule '; partSentence = ['ich', 'gehe', 'zu', 'Schule']; result = 'go'; ' –

Antwort

1

Wenn es genügend Regelmäßigkeit im Code gibt, müssen Sie eine Funktion schreiben, die den Satz und die anderen Dinge akzeptiert, die bestimmen, was damit zu tun ist. Dies wird manchmal als Parametrisierung bezeichnet. Zum Beispiel mit dem oben, vermutlich vereinfachten Beispiele, würden Sie

def process(sentence, parttest, offset): 
    for num, part in enumerate(sentence): 
     if part == parttest: 
      return sentence[num+offset] 

und fordern erstes und zweites Beispiel haben jeweils

result = process(sentence, 'to', -1) 
result2 = process(sentence, 'in', +1) 

Jetzt können Sie die Parameter (parttest, Offset) aus einer Datenbank erhalten . Ausgehend von Ihrem Beitrag kann auch ein regulärer Ausdruck in Zeichenfolgenform vorliegen, der aus der Datenbank abgerufen werden kann, und process kann um eine reguläre Ausdruckszeichenfolge erweitert werden, die bei Bedarf kompiliert wird.

Optimieren Sie später: Behalten Sie einen lokalen Cache kompilierter regulärer Ausdrücke in einem dict bei, oder picken Sie sie, weil das wiederholte Kompilieren derselben eine nicht unwesentliche Verschwendung von CPU sein kann.

Hoffe, das hilft.

+0

Das ist eigentlich für mich gearbeitet, danke. –