2017-02-17 2 views
1

In einer zufälligen Zeichenkette muss ich eine Zeichenkette finden, die einem gegebenen Muster entspricht, und setze ; nach dieser Zeichenkette. Ich denke, ich sollte re verwenden, um es zu tun, aber ich bin nicht damit vertraut.Finden einer Zeichenkette, die einem gegebenen Muster entspricht, und Trennen von Linien mit Pythons neuem Modul

Beispiel Eingabe:

this is the first part of string 1/32 part this is the second part of string 

als Ergebnis, ich brauche ; nach dem 1/32 part zu setzen, zB

this is the first part of string 1/32 part; this is the second part of string 

Ich weiß, ich re verwenden sollte, und ich weiß, dass ich wahrscheinlich re.match verwenden sollten mit einem Muster, das wie [1-1000]/[1-1000]\spart aussieht, aber ich bin nicht sicher, wohin ich von hier gehen soll.

Edit: 1/32 ein Beispiel ist, kann es 65/123, 1/3, sein 6/7

+0

Und warum '[1-1000]'? Was ist Ihre genaue Anforderung? Ist es wichtig, ob es '/' gibt oder nicht? –

+5

Mind '[1-1000]' ist eine * Zeichengruppe * und passt nur '0' und' 1' ... –

+0

Sie müssen nur '\ d +/\ d + \ s + part' – anubhava

Antwort

4

Ihr Anwendungsfall heißt Substitution. Genau dafür steht die Funktion re.sub.

import re 

s = "bla 1/6 part bla bla 76/88 part 12345/12345 part bla" 
print(s) 
s = re.sub(r'(\b\d{1,4}/\d{1,4} part)', r'\1;', s) 
print(s) 

Der Ausgang dieses ist

bla 1/6 part; bla bla 76/88 part; 12345/12345 part bla 

Notiere die ; nach dem letzten Auftreten von part fehlt.

I verwendet {} quantifiers Zähler und Nenner der Fraktionen bis 4 Dezimalstellen zu begrenzen, die etwas, das Sie von Ihnen [1-1000] Notation erwähnt ist.Es könnte sogar noch besser durch 1?\d{1,3} approximiert werden (aber dies ist auch nicht exakt dasselbe, es erlaubt auch beispielsweise 1999/1999) [1].


[1] P.S. Wie tripleee commented, der genaue reguläre Ausdruck für Dezimalzahlen von 1 bis 1000 ist [1-9]([0-9][0-9]?)?|1000, sieht es ein wenig kompliziert aus, aber das Gebäudemuster wird offensichtlich, wenn Sie die einzige 4-stellige Zahl 1000 trennen und ein überflüssiges Paar Klammern auf der verwenden 1- bis 3-stelliger Teil: [1-9]([0-9]([0-9])?)?. Eine andere Option besteht darin, die Zeichenklassenverknüpfung \d für [0-9] zu verwenden, was zu [1-9]\d{0,2}|1000 führt.

Edit:

  • das Spiel Gruppierung kombiniert werden.
  • Der Anker vor dem Zähler wurde hinzugefügt.
+0

danke. löste mein Problem :) – krizz

4

Sie haben nur re.match und re.sub vom re Modul zu verwenden, zusammen mit dem unten regex

import re 

my_str = 'this is the first part of string 1/32 part this is the second part of string' 
my_regex = r'(\d+/\d+\s+part)' 

if re.match(my_regex, my_str): 
    print(re.sub(my_regex, r'\1,', my_str)) # this will print: 1/32 part, 
    # ... 

Bare mit die Tatsache, dass Sie der Regex einige zusätzliche Flags hinzufügen müssen, wenn Sie mehrere Zeilen benötigen, um dieselbe Regex zu finden. Eine Liste solcher Flags finden Sie unter here.

können Sie sehen die regex here


Ein schneller Ersatz (es könnte bessere Möglichkeiten sein) wäre auch die Teile passen vor und nach dem passenden Teil gewünscht und so etwas wie:

import re 

my_str = 'this is the first part of string 1/32 part this is the second part of string' 
my_regex = r'(.*)(\s+\d+/\d+\s+part)(.*)' 

condition = re.match(my_regex, my_str) 

if condition: 
    part = re.sub(my_regex, r'\2,', my_str) 

x = condition.group(1) + part + condition.group(3) 
print(x) 

die Ausgabe der modifizierte string:

dies ist der erste Teil der Zeichenfolge 1/32 Teil, das ist der zweite Teil des Zeichenfolge

Eine einfache einzeilige Funktion mit allen oben wäre:

import re 


def modify_string(my_str, my_regex): 
    return re.sub(my_regex, r'\1,', my_str) 

if __name__ == '__main__': 
    print(modify_string('first part of string 1/32 part second part of string', r'(\d+/\d+\s+part)')) 

Aber ich würde empfehlen, den Zustand zu halten. Nur für den Fall.

+0

Wie ersetze ich es in my_str, so dass es "," nach "Teil" enthält? – krizz

Verwandte Themen