2016-06-02 4 views
-1

Для моей работы я привык работать с Matlab. Нет, я также пытаюсь изучить базовые навыки работы с python. В настоящее время я работаю над на следующей Excersise:Stdin Stdout python

Вы заинтересованы в извлечении всех вхождений, которые выглядят как это

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

В частности, вы хотите, чтобы собрать числовые значения (например, -17.23014168) и распечатать их. Напишите сценарий, который читает выходной файл со стандартного ввода, и использует регулярные выражения для , чтобы найти значения, которые вы хотите извлечь. Попросите свой сценарий распечатать все значения на стандартный вывод.

Это код, я использую:

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) 

С помощью этого кода я могу найти все значения в файле данных, они просят. Однако у меня есть несколько вопросов. Во-первых, они задают кое-что о stdin и stdout. Нет, мне интересно, я использую правильный код для чтения выходного файла со стандартного ввода и действительно ли я распечатываю все значения до стандартного вывода таким образом? Более того, мне интересно, есть ли лучший или более простой способ найти нужные значения?

+0

Это очень трудно найти регулярное выражение, если у вас есть только одна строка ввода. –

ответ

0

Зачем использовать регулярное выражение? Разделить вход:

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

Конечно, если вы можете предоставить больше образцов вход, который не ставит номер на 5-ю позицию, это, возможно, не достаточно.

Спрашивайте у вашего преподавателя больше ввода образца.

STDIN and STDOUT are documented.

1

Чтобы найти номера, которые вы ищете, я бы использовал позитивную функцию lookbehind и lookahead в вашем регулярном выражении.

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

Это проверяет, является ли вещь, которую вы смотрите на это протекала по «Bond Energy LDA» и затем «» эВ, но не включает их в строку, которую вы извлечь. Поэтому, предполагая, что числа, которые вы ищете, всегда продолжаются и следуют за этими двумя вещами, которые вы можете найти так.

Хорошим способом чтения из stdin является использование модуля sys python.

import sys 

Затем вы можете читать строки прямо из стандартного ввода:

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()) 

Если регулярное выражение не находится на линии, то matchObj будет нулевым пропуске, если заявление. Если он будет найден, поиск вернет группы, содержащие matchObj. Затем вы можете распечатать группу в stdout, поскольку печать по умолчанию будет печатать на stdout, если файл не указан.

0

Если вы хотите использовать регулярное выражение, вы можете использовать:

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

Demo