2016-06-02 11 views
-1

Für meine Arbeit bin ich es gewohnt mit Matlab zu arbeiten. Nein, ich versuche auch die grundlegenden Fähigkeiten von Python zu lernen. Zur Zeit arbeite ich an am folgenden excersise:Stdin Stdout python

Sie interessieren sich für alle Vorkommen zu extrahieren, die diese

<Aug22-2008> <15:37:37> Bond Energy LDA -17.23014168 eV

Insbesondere wie aussehen, möchten Sie die Zahlenwerte sammeln, (z. B. -17.23014168), und drucken Sie sie aus. Schreiben Sie ein Skript, das die Ausgabedatei von der Standardeingabe liest, und verwenden Sie reguläre Ausdrücke, um die zu extrahierenden Werte zu finden ( ). Lassen Sie Ihr Skript alle die Werte zur Standardausgabe ausdrucken.

Dies ist der Code, den ich verwenden:

import os,re 
from string import rjust 

dataEx=re.compile(r''' 
    ^\s* 
    <Aug22-2008> 
    \s+ 
    <\d{2}:\d{2}:\d{2}> 
    \s+ 
    Bond 
    \s 
    Energy 
    \s 
    LDA 
    \s+ 
    ((\+|-)?(\d*)\.?\d*) 

    ''',re.VERBOSE) 




f=open('Datafile_Q2.txt','r') 
line = f.readline() 
while line != '': 
line = f.readline() # Get next line 
m = dataEx.match(line) 
if m: 
    # print line 
    print m.group(1) 

Mit diesem Code ich in der Lage bin, alle Werte in der Daten-Datei sie fragen zu finden. Ich habe jedoch ein paar Fragen. Zuerst fragen sie etwas über Standard und Standard. Nein, ich frage mich, ob ich den richtigen Code verwende, um die Ausgabedatei von der Standardeingabe zu lesen, und kann ich wirklich alle Werte auf diese Weise auf die Standardausgabe ausgeben? Außerdem frage ich mich, ob es einen besseren oder einfacheren Weg gibt, die erforderlichen Werte zu finden?

+0

Es ist sehr schwer, einen regulären Ausdruck zu finden, wenn alles, was Sie haben eine einzige Zeile eingegeben wird. –

Antwort

0

Warum einen regulären Ausdruck verwenden? Teilen Sie die Eingabe:

>>> s = """<Aug22-2008> <15:37:37> Bond Energy LDA -17.23014168 eV""" 
>>> s.split()[5] 
'-17.23014168' 

Natürlich, wenn Sie mehr Abtastwerteingang bereitstellen kann, die nicht die Nummer auf der fünften Position hat gesagt, das ist vielleicht nicht genug.

Fragen Sie Ihren Lehrer nach mehr Beispieleingabe.

STDIN and STDOUT are documented.

1

Um die Zahlen zu finden, nach denen Sie suchen, würde ich eine positive Lookbehind- und Lookahead-Funktion in Ihrem regulären Ausdruck verwenden.

(?<=Bond Energy LDA).*(?= eV) 

Diese überprüft, ob das, was Sie sind auf der Suche nach ‚Bond Energie LDA‘ fort und gefolgt von ‚eV‘, aber Sie extrahieren sie nicht im String enthalten. Wenn Sie also davon ausgehen, dass die Zahlen, nach denen Sie suchen, immer weiterverfolgt werden und von diesen beiden Dingen gefolgt werden, können Sie sie so finden.

Eine nette Methode zum Lesen von stdin ist die Verwendung des Python-Moduls sys.

import sys 

Dann können Sie Linien gerade von stdin lesen:

import sys 
import re  

from line in sys.stdin: 
    matchObj = re.search(r '(?<=Bond Energy LDA).*(?= eV)', line, re.I) 
    if(matchObj): 
     print(matchObj.group()) 

Wenn der reguläre Ausdruck nicht auf der Linie gefunden wird, dann matchObj null sein wird, die if-Anweisung übersprungen wird. Wenn es gefunden wird, gibt die Suche ein matchObj zurück, das Gruppen enthält. Sie können die Gruppe dann als Standard ausgeben, da der Ausdruck standardmäßig auf Standard drucken wird, wenn keine Datei angegeben wird.

0

Wenn Sie regex verwenden möchten können Sie verwenden:

(?:<.*>\W+)[a-zA-Z ]+([-+]?[0-9]*\.?[0-9]+) 

Demo

Verwandte Themen