2017-10-30 6 views
0

Ich habe eine Liste der Fehlercodes und einer dieses Codes ist:Behandelt Python^als Leerzeichen in split()?

Dial code generated note %d on stn ^char, cct %d^cct_chk^cct_chk 

keine Begriffe, die ein %, ^ oder $ Symbol enthalten eine Variable ist, und ich brauche diese gesamten variablen Bedingungen mit <*> zu ersetzen.

So sollte die obige Zeile wie folgt aussehen:

Dial code generated note <*> on stn <*> cct <*> 

Um dies zu tun, habe ich geschrieben:

message = "Dial code generated note %d on stn ^char, cct %d^cct_chk^cct_chk" 
for term in message.split(): 
    if '^' in term: 
     message = message.replace(term, '<*>') 
    if '$' in term: 
     message = message.replace(term, '<*>') 
    if '%' in term: 
     message = message.replace(term, '<*>') 
print (message) 

Für die meisten Nachrichten dieses gearbeitet zu haben scheint. Aber für dieses Beispiel erhalte ich:

>>Dial code generated note <*> on stn <*> <*> <*>^<*>_chk^<*>_chk 

Es scheint, als ob es die ^ wie ein Leerzeichen zu behandeln, da sonst der gesamte letzte Begriff sollte mit <*> ersetzt wurde. Kann mir jemand sagen, warum das ist?

+1

Sie haben bereits Ersetzt alle '% d's durch' <*> ', so dass du zu dem Zeitpunkt, an dem du zu dieser letzten Zeit kommst, nicht mehr das hast, was du in der Split-Version hast. Kurze Antwort: Nein, ist es nicht. Aber Ihre Ausgabe stimmt nicht ganz mit dem Code überein, den Sie gepostet haben. – jonrsharpe

+0

Ah ok. Weißt du, wie ich es in diesem Fall beheben würde, so gibt es mir die Ausgabe, nach der ich suche? –

+0

Unter Verwendung Ihres Beispielcodes erhalte ich 'Vorwahlcode erzeugte Anmerkung <*> auf Stn <*> cct <*>^cct_chk^cct_chk 'Ausgabe, die von Ihrer Beispielausgabe unterschiedlich ist. –

Antwort

1

replace hat einen dritten Parameter zu ermöglichen, die Anzahl der Ersetzungen zu begrenzen. In Ihrem Fall wird Ihr Problem dadurch verursacht, dass eine Ersatzzeichenfolge mehrmals verwendet wird: %d wird im letzten Wort ersetzt.

Eine einfache Lösung ist es, die Anzahl der Ersetzungen auf 1 zu begrenzen:

message = "Dial code generated note %d on stn ^char, cct %d^cct_chk^cct_chk" 
for term in message.split(): 
    if '^' in term: 
     message = message.replace(term, '<*>', 1) 
    if '$' in term: 
     message = message.replace(term, '<*>', 1) 
    if '%' in term: 
     message = message.replace(term, '<*>', 1) 
print (message) 

BTW, nur term und message bei jeder Iteration Druck würde offensichtlich den Fehler gemacht hat ...

2

Sie können geteilt und montieren wieder die Stücke, die Sie mögen:

message = "Dial code generated note %d on stn ^char, cct %d^cct_chk^cct_chk" 

message = ' '.join('<*>' if any(item in term for item in '^$%') 
        else term for term in message.split()) 
print(message) 

Ausgang:

Dial code generated note <*> on stn <*> cct <*> 
Verwandte Themen