我正在学习 python
,并尝试使用 regex
。我习惯用 shell 脚本(awk
、grp
和 sed
)来做到这一点,但需要用 python
。
在我的文件中,我有这样的行:
species,subl,cmp= 1 7 1 s1,torque=-0.65079E-11-0.59320E-15
species,subl,cmp= 1 6 1 s1,torque= 0.30782E-10 0.65641E-14
在 shell 脚本中,我可以用
var_s1=`grep "species,subl,cmp= $3 $4 $5" $tfile |sed -r 's/.*(.{11}).{12}/\1/'`
但是,尝试用 python 代码做到这一点:
#!/usr/bin/python
import sys,math,re
infile=sys.argv[1]; oufile=sys.argv[2]
ifile=open(infile, 'r'); ofile=open(oufile, 'w')
pattern=r'species,subl,cmp=\s{4}(.*)\s{4}(.*)\s{4}(.*)\s{3}s1,torque=(.*)\s{1}(.*)'
ssc1=[];ssc2=[];ssc3=[]; s1=[]; t=[]
for line in ifile:
match = re.search(pattern, line)
if match:
ssc1. append(int(match.group(1)))
ssc2. append(int(match.group(1)))
ssc3. append(int(match.group(1)))
s1. append(float(match.group(1)))
t. append(float(match.group(1)))
# ofile.write('%g %g %g' %(ssc1, s1,t))
#print('%5.3e %5.3e' s1,t)
for i in range(len(t)):
print('%g %g %g' % (ssc1[i], s1[i], t[i]))
ifile.close(); ofile.close()
给出所有结果为 1:
$ python triel2.py out-Dy-eos2 tres
1 1 1
1 1 1
请告诉我哪里出错了。 我正在关注 this book .但作为一个初学者,请推荐我更好的方法。
最佳答案
改变这个:
ssc1. append(int(match.group(1)))
ssc2. append(int(match.group(1)))
ssc3. append(int(match.group(1)))
s1. append(float(match.group(1)))
t. append(float(match.group(1)))
为此:
ssc1. append(int(match.group(1)))
ssc2. append(int(match.group(2)))
ssc3. append(int(match.group(3)))
s1. append(float(match.group(4)))
t. append(float(match.group(5)))
“扭矩”后面的文字似乎有问题。在文件示例的第一行中,数字之间没有空格。您可以根据字段宽度而不是分隔符拆分这两个数字。一种方法是替换正则表达式的这一部分:
torque=(.*)\s{1}(.*)
用这个:
torque=(.{12})(.{12})
假定“扭矩”后的数字均使用 12 个字符的字段宽度。
另一种方法是用“(.*)”匹配“torque”之后的所有内容,然后使用 python 字符串切片来分离匹配的文本。
关于python - 带有python错误的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20018637/