Stdin Stdout蟒蛇

时间:2016-06-02 13:30:17

标签: python

对于我的工作,我习惯使用matlab。不,我也尝试学习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的具体内容。不,我想知道我是否使用正确的代码从标准输入读取输出文件,我是否真的以这种方式将所有值打印到标准输出?此外,我想知道是否有更好或更简单的方法来找到所需的值?

3 个答案:

答案 0 :(得分:1)

要查找您要查找的数字,我会在正则表达式中使用正面的lookbehind和lookahead函数。

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

这将检查您正在查看的内容是否由“Bond Energy LDA”继续,然后是“eV”,但不会将其包含在您提取的字符串中。因此,假设您正在寻找的数字总是继续进行,然后是这两件事,您就可以找到它们。

从stdin读取的一个好方法是使用sys python模块。

import sys

然后你可以直接从stdin中读取线条:

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将跳过if语句为null。如果找到,搜索将返回包含组的matchObj。然后,您可以将组打印到标准输出,因为如果没有给出文件,打印将默认打印到标准输出。

答案 1 :(得分:0)

为什么要使用正则表达式?拆分输入:

   String.Format(
     @"insert into comandadvd (
         Id_Comanda,
         Id_Format,
         Data_Comanda,
         Id_TipPlata,
         Pret)
       values ( 
         {0},
         {1},
         to_date('{2}', 'DDMMYYY'),
         {3},
         {4})",
      txt_idComanda.Text,
      txtFormat.Text, 
      txtData.Text,
      txtIdTipPlata.Text,
      txtPret.Text);

当然,如果您可以提供更多的样本输入,而不是将数字放在第5位,这可能还不够。

请教老师提供更多样本输入。

STDIN and STDOUT are documented

答案 2 :(得分:0)

如果您想使用正则表达式,您可以使用:

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

Demo