2017-05-16 2 views
1

Angesichts der Zeichenfolge: s = "101010101", ich möchte jedes Auftreten des Musters 010 mit dem Muster 0X0 ersetzen, so dass das Ergebnis s = "10X0X0X01" sein sollte.Alle überlappenden Muster in einer Zeichenfolge ersetzen

Ein anderes ähnliches Problem ist, das gleiche Muster 010 durch 00 zu ersetzen, so dass die resultierende Zeichenfolge s = 100001 sein sollte.

Bisher habe ich versucht, durch:

import re 
s = "101010101" 
s = re.sub("010", "0X0", s) 

aber die resultierende Zeichenfolge 10X010X01, fehlte die 1 in der Mitte zu ersetzen.

Irgendwelche Hilfe?

Antwort

2

können Sie lookarounds verwenden, um Werte zu finden, ohne sie im Spiel einschließlich:

s = re.sub(r"(?<=0)1(?=0)", "X", s) 

(?<=0)1(?=0) entspricht einem einzelnen 1 Charakter, der vorangeht - (?<=…) - und folgte - (?=…) - durch eine Null.

+0

Großartig! Was ist mit dem Problem, '010' durch' 00' zu ersetzen? – Ale

+1

@Ale: '" X "' → '" "' – Ryan

+0

Ja, ich habe es gerade erkannt. – Ale

-1

Fast alle String-Manipulationsprobleme können mit Regex gelöst werden. Das bedeutet nicht, dass du sie benutzen solltest. Dies scheint wie ein natürliches Problem, um Regex zu verwenden, aber Sie brauchen nicht wirklich brauchen es. Sie können nur die Vorder-/Hinter 1s abzustreifen, dann die 1s in der Mitte ersetzen, dann legen Sie die Vorder-/Hinter 1s zurück auf:

s = "101010101" 
s = "1" + s[1:-1].replace("1", "X") + "1" 

print s 

Ausgänge: 10X0X0X01

s = "101010101" 
s = "1" + s[1:-1].replace("1", "") + "1" 

print s 

Ausgänge: 100001

Ich denke, was Sie finden, ist, dass Regex extrem mächtig sind, aber praktisch unlesbar und schwer zu verstehen. Nehmen Sie zum Beispiel Ihre Frage. Was du getan hast, sieht so aus, als ob es jemandem funktionieren würde, der keine Erfahrung mit Regex hat, aber das tut es nicht.

Es ist ein Kompromiss, aber Einfachheit gewinnt immer in meinem Buch.

+0

Ich schätze Ihren Vorschlag, aber es scheint zu spezifisch zu sein. In der Tat geht es darum, überlappende Muster zu ersetzen. Trotzdem danke. – Ale

+0

Fair genug. Ich bin mir nicht sicher, ob es den Downvote verdient hätte. Es beantwortet diese (spezifische) Frage. – mwm314

+0

Ich habe Ihren Beitrag NICHT heruntergestimmt. – Ale

Verwandte Themen