2016-03-30 8 views
0

Hier ist, was ich habe:Ersetzen von Teilstrings unter bestimmten Bedingungen

stem_text = "x^3+21x^2+1x+6" 

Und ich möchte es ändern:

stem_text = "x^3+21x^2+x+6" 

Hier ist, was mein Code wie folgt aussieht:

indices = [m.start() for m in re.finditer("1x", stem_text)] 
for i in indices: 
    if stem_text[i-1] not in ["0","1","2","3","4","5","6","7","8","9"]: 
     stem_text = stem_text.replace(stem_text[i:i+2],"x")` 

Aber es ersetzt beide Vorkommen von "1x" immer noch.

Ich habe diese beiden Posten verwendet, um mich zu einem Punkt, wo ich denke, was ich haben sollte funktionieren, aber es ist nicht:

+0

Suchen Sie nur exakte Vorkommen von '1x' zu ersetzen? – ILostMySpoon

+0

Sie könnten versuchen, den regulären Ausdruck zu '\ + 1x' statt nur '1x' zu ändern – LonelyC

+1

Eine einfache Regex wäre hier wirklich einfach. Ersetzen Sie/(\ D) 1x/mit $ 1x –

Antwort

1

Angenommen, Sie alle genauen Vorkommen von 1x mit x zu ersetzen suchen, können Sie re.sub

import re 

stem_text = "x^3+21x^2+1x+6" 

re.sub(r'\b1x\b', 'x', stem_text) 

\b verwenden hier bedeutet word boundary

0

hinzufügen \ b zu Ihrem Muster 1x für genaue Übereinstimmung das Wort 1x andere als passende 21x oder andere Wörter enthalten 1x

import re 
stem_text = "x^3+21x^2+1x+6" 

print(re.sub(r'\b1x\b', r'x', stem_text)) 

Das Ergebnis ist

x^3+21x^2+x+6 

lesen python regex docs

0

wenn Sie nur ersetzen wollen "1x" verwenden Sie folgendes Beispiel:

stem_text = "x^3+21x^2+1x+6" 
indices = [x for x in stem_text.split("+")] 
for i in indices: 
    if len(i) == 2 and i == "1x": stem_text = stem_text.replace(i + "+", "x+") 

print stem_text 

Ausgang: x^3+21x^2+x+6

sonst, wenn Sie eine beliebige Anzahl ersetzt werden soll, bevor "x" verwenden Sie folgendes Beispiel:

stem_text = "x^3+21x^2+1x+6+2x+4x+0x" 
indices = [x for x in stem_text.split("+")] 
Int = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] 
for x in indices: 
    for i in Int: 
     if x == i + "x": stem_text = stem_text.replace(i + "x", "x") 

print stem_text 

output: x^3+x^2+x+6+x+x+x

+0

Ihr erstes Beispiel ersetzt die '1x' in' 21x' was nicht das ist, was OP will, glaube ich. Die Idee hinter dem Ersetzen von '1x' durch' x' liegt darin, dass in Mathe die "1" vor dem "x" als "implizierte 1" bezeichnet wird und daher einfach als x geschrieben wird. – ILostMySpoon

+0

@ILostMySpoon ohh, ich vermisse es. Danke, ich habe die Antwort bearbeitet. –

1

Wenn Gleichung nur Additionsoperator hat:

stem_text = "x^3+21x^2+1x+6" 

new_string = stem_text.replace('+1x','+x') 
print(new_string) 

Ausgang:

x^3+21x^2+x+6 

Wenn Gleichung hat mehrere Operatoren:

stem_text = '1x+1x-1x/1x*1x+10x' 
op_list = ['','+','-','*','/'] 
#list of operations in equation 
for each_op in op_list: 
    stem_text = stem_text.replace(each_op+'1x',each_op+'x') #'each_op + 1x' is used to prevent replacing nos. like 21x,31x etc 


print(stem_text) 

Ausgang:

x+x-x/x*x+10x 

Hinweis: Dies ist ineffizient Lösung

0

Die meisten der Antworten vor, die bereits erledigt werden.Dies ist eine Lösung, die in einer anderen Antwort auf diese Frage inspiriert wurde, aber sie kann mit jedem Buchstaben in Ihrer Zeichenfolge verwendet werden. Wie in docs beschrieben, ist es Rückreferenzierungen genannt

>>> import re 
>>> regex = r'\b1(\w)\b' 
>>> print(re.sub(regex, r'\g<1>', 'z^3+4z^2+1z+5')) 
z^3+4z^2+z+5 
>>> print(re.sub(regex, r'\g<1>', 'y^3+21y^2+1y+6')) 
y^3+21y^2+y+6 
Verwandte Themen