对于我的工作,我习惯使用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的具体内容。不,我想知道我是否使用正确的代码从标准输入读取输出文件,我是否真的以这种方式将所有值打印到标准输出?此外,我想知道是否有更好或更简单的方法来找到所需的值?
答案 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位,这可能还不够。
请教老师提供更多样本输入。
答案 2 :(得分:0)