2017-07-10 1 views
1

Wie kann ich die Datei lesen und finden alle Zeilen Übereinstimmung Muster beginnen mit \ d + \ s. Und die ersetzen den Schreibraum zu,. Einige Zeilen enthalten englisches Zeichen. Aber einige der Linien sind Chinesen. Ich Gast der Schreibraum in chinesischer Codierung ist anders mit Englisch?Python 2.7 Suchzeile, wenn Übereinstimmungsmuster und Ersetzungszeichenfolge

Beispiel (text.txt)

asdfasdf 
1 abcd 
2 asdfajklsd 
3 asdfasdf 
4 ... 
asdfasdf 
66 ... 
aasdfasdf 
99 ... 
100 中文 
101 中文 
102 asdfga 
103 中文 

Mein Testcode:

with open('text.txt', 'r') as t: 
    with open('newtext.txt', 'w') as nt: 
      content = t.readlines() 

      for line in content: 
        okline = re.compile('^[\d+]\s') 
          if okline: 
          ntext = re.sub('\s', ',', okline) 
          nt.write(ntext) 
+0

Sie möchten alle Leerzeichen durch Kommas ersetzen? Warum nicht einfach 'str.replace' verwenden? –

+1

Ich weiß nicht, warum Sie nach dem Vorhandensein von 're.compile' suchen. Es wird immer wahr zurückgegeben, du meinst 'okline = re.match (r '\ d + \ s', line)'? –

+0

@COLDSPEED Bevor ersetzen die Leerzeichen, möchte ich herausfinden, alle Zeilen beginnen mit Ziffer. Wie meine Beispieldatei zeigt, gibt es einige Zeilen, die nicht mit Ziffern beginnen. Diese Zeilen werden nicht in newtext.txt gespeichert. – Enoch

Antwort

0

Sie dies tun könnte:

# Reading lines from input file 
with open('text.txt', 'r') as t: 
    content = t.readlines() 

# Opening file for writing 
with open('newtext.txt', 'w') as nt: 

    # For each line 
    for line in content: 

     # We search for regular expression 
     if re.search('^\d+\s', line): 

      # If we found pattern inside line only then can continue 
      # and substitute white spaces with commas and write to output file 
      ntext = re.sub('\s', ',', line) 
      nt.write(ntext) 

Es gab mehrere Probleme mit Ihrem Code, für Anfänger \d ist Zeichenklasse, im Grunde \d ist das gleiche wie [0-9], also müssen Sie es nicht in eckige Klammern setzen. Sie können regex demo here sehen. Sie haben auch überprüft, ob das Kompilierobjekt True ist, da der Kompiliervorgang erfolgreich ist Kompilierobjekt wird immer True sein.

Auch sollten Sie verschachtelte with Anweisungen vermeiden, mehr Pythonic Weg ist, Dateien mit with zu öffnen, lesen Sie es und schließen Sie es dann.

+0

Vielen Dank für Ihre Antwort. Ich weiß nicht, warum es ein 0 Byte newtext.txt – Enoch

+0

Np ausgab. :) Können Sie meine Antwort akzeptieren? https://meta.stackexchange.com/questions/23138/how-to-accept-the-answer-on-stack-overflow –

+0

@Enoch gab es einen Tippfehler, haben Sie 'content = t.readlines()' kopiert? –

1

Mit einzelner re.subn() Funktion:

with open('text.txt', 'r') as text, open('newtext.txt', 'w') as new_text: 
    lines = text.read().splitlines() 
    for l in lines: 
     rpl = re.subn(r'^(\d+)\s+', '\\1,', l) 
     if rpl[1]: 
      new_text.write(rpl[0] + '\n') 

Der Hauptvorteil ist, dass re.subn ein Tupel zurück (new_string, number_of_subs_made) wo number_of_subs_made der entscheidende Wert ist auf die Substitution zeigt auf der benötigten angepassten Linie gemacht

+0

Ja, es ist Arbeit! Aber es funktioniert nur auf Englisch Charakter. In der Tat, es gibt einige Zeilen, die chinesisches Schriftzeichen enthalten. Für Linien enthält chinesisches Schriftzeichen, es ist fehlgeschlagen. Tut mir leid, ich bin ein Anfänger im Programmieren. – Enoch

0

Kompaktcode

import re 

with open('esempio.txt', 'r') as original, open('newtext2.txt', 'w') as newtext: 
    for l in original.read().split('\n'): 
     if re.search("^\d+\s",l): 
      newtext.write(re.sub('\s', ',', l)+'\n')