2016-08-03 13 views
1

Ich habe eine Zeichenfolge zu tauschen:Gibt es eine bessere Art und Weise String ohne Platzhalter

>>> s = 'Y/NOUN/dobj>_hold/VERB/ROOT_<membership/NOUN/dobj_<with/ADP/prep_<X/PROPN/pobj_>,/PUNCT/punct' 

Und das Ziel ist, zu ändern, um die Position von Y/ zu X/, also so etwas wie:

>>> s.replace('X/', '@@').replace('Y/', 'X/').replace('@@', 'Y/') 
'X/NOUN/dobj>_hold/VERB/ROOT_<membership/NOUN/dobj_<with/ADP/prep_<Y/PROPN/pobj_>,/PUNCT/punct' 

Angenommen, es wird kein Konflikt bei der Ersetzung geben, dh X/ und Y/ ist einzigartig und wird nur einmal in der ursprünglichen Zeichenfolge vorkommen.

Gibt es eine Möglichkeit, die Ersetzung ohne den Platzhalter zu tun? Momentan tausche ich ihre Position mit dem Platzhalter @@.

+0

Verwenden Sie '\ 0' anstelle von' @@ ', um die Wahrscheinlichkeit eines Konflikts zu verringern. – anubhava

+0

Ja, es gibt Wege. Benutzt du Python? –

+1

@ Wiktor ja, Python. – alvas

Antwort

2

In Python, eine einfache Möglichkeit, eine Regex über eine Lambda im re.sub Ersatzteil, wo Sie bewerten können/Texte überprüfen mit der Erfassung Gruppen erfaßt und wählen Sie eine entsprechenden Ersatz:

So (X|Y)/ (Ich gehe davon aus X und Y sind potenziell 'multi Zeichenfolge Platzhalter, sonst verwenden ([XY])) funktionieren sollte:

import re 
s = 'Y/NOUN/dobj>_hold/VERB/ROOT_<membership/NOUN/dobj_<with/ADP/prep_<X/PROPN/pobj_>,/PUNCT/punct' 
print(s) 
print(re.sub(r"(X|Y)/", lambda m: "Y/" if m.group(1) == 'X' else 'X/' , s)) 

Ausgang:

Y/NOUN/dobj>_hold/VERB/ROOT_<membership/NOUN/dobj_<with/ADP/prep_<X/PROPN/pobj_>,/PUNCT/punct 
X/NOUN/dobj>_hold/VERB/ROOT_<membership/NOUN/dobj_<with/ADP/prep_<Y/PROPN/pobj_>,/PUNCT/punct 
+1

Danke @wiktor! Genau die richtige Art von Regex-Lösung, nach der ich gesucht habe. – alvas

Verwandte Themen