Skip to main content
 首页 » 编程设计

python之带有python错误的正则表达式

2025年05月04日36zengkefu

我正在学习 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 字符串切片来分离匹配的文本。