eine Zeichenfolge wie folgt gegeben:Vereinfachen die Extraktion von bestimmtem String-Muster mit einem mehr if-else und split()
>>> s = "X/NOUN/dobj>_hold/VERB/ROOT_<membership/NOUN/dobj_<with/ADP/prep_<Y/PROPN/pobj_>,/PUNCT/punct"
Zuerst habe ich die Zeichenfolge von Unterstrichen geteilt werden soll, das heißt:
>>> s.split('_')
['X/NOUN/dobj>',
'hold/VERB/ROOT',
'<membership/NOUN/dobj',
'<with/ADP/prep',
'<Y/PROPN/pobj',
'>,/PUNCT/punct']
Wir nehmen an, dass der Unterstrich ausschließlich als Trennzeichen verwendet wird und nie als Teil der Teilzeichenfolge vorhanden ist, die wir extrahieren möchten.
Dann muss ich zuerst überprüfen, ob jeder dieser "Knoten" in meiner gespaltenen Liste oben beginnt von Enden mit einem '>', '<', dann entfernen Sie es und setzen Sie die entsprechende Klammer als das Ende der Unterliste, so etwas wie:
result = []
nodes = s.split('_')
for node in nodes:
if node.endswith('>'):
result.append(node[:-1].split('/') + ['>'])
elif node.startswith('>'):
result.append( node[1:].split('/') + ['>'])
elif node.startswith('<'):
result.append( node[1:].split('/') + ['<'])
elif node.endswith('<'):
result.append( node[:-1].split('/') + ['<'])
else:
result.append( node.split('/') + ['-'])
Und wenn es nicht der Enden mit einer Winkelhalterung läuft dann anhängen wir -
bis zum Ende des sublist.
[out]:
[['X', 'NOUN', 'dobj', '>'],
['hold', 'VERB', 'ROOT', '-'],
['membership', 'NOUN', 'dobj', '<'],
['with', 'ADP', 'prep', '<'],
['Y', 'PROPN', 'pobj', '<'],
[',', 'PUNCT', 'punct', '>']]
die ursprüngliche Eingangskette gegeben, gibt es eine weniger ausführliche Art und Weise auf das Ergebnis zu bekommen? Vielleicht mit Regex und Gruppen?
Ich habe meine Antwort aktualisiert. Ich glaube, ich habe den kürzesten gefunden. Ich benutze Ternär, um Regex seine Arbeit zu tun –