我想编写一个python脚本来读取包含以下内容的文本文件:
FRAME
1 J=1,8 SEC=CL1 NSEG=2 ANG=0
2 J=8,15 SEC=CL2 NSEG=2 ANG=0
3 J=15,22 SEC=CL3 NSEG=2 ANG=0
输出一个如下所示的文本文件:
1 1 8
2 8 15
3 15 22
我基本上不需要逗号或SEC,NSEG和ANG数据。有人可以帮我使用正则表达式吗?
到目前为止,我有这个:
import re
r = re.compile(r"\s*(\d+)\s+J=(\S+)\s+SEC=(\S+)\s+NSEG=(\S+)+ANG=(\S+)\s")
with open('RawDataFile_445.txt') as a:
# open all 4 files with a meaningful name
file=[open(outputfile.txt","w")
for line in a:
答案 0 :(得分:1)
我的建议?由于我不会写很多正则表达式,所以我避免一次性写出大的正则表达式。既然你已经完成了,我会尝试一次验证一小块,如本代码所示。
import re
r = re.compile(r"\s*(\d+)\s+J=(\S+)\s+SEC=(\S+)\s+NSEG=(\S+)+ANG=(\S+)\s")
r = re.compile(r"\s*(\d+)")
r = re.compile(r"\s*(\d+)\s+J=(\d+)")
with open('RawDataFile_445.txt') as a:
a.readline()
for line in a.readlines():
result = r.match(line)
if result:
print (result.groups())
第一个正则表达式是你完整的表达方式。下一行是我验证的第一个块。下一行是第二个更大的块。注意稍有变化。
此时我会回去,对原始的整个正则表达式进行修正,然后复制一个更大的块来尝试。并重新运行。
答案 1 :(得分:1)
没有正则表达式:
for line in file:
keep = []
line = line.strip()
if line.startswith('FRAME'):
continue
first, second, *_ = line.split()
keep.append(first)
first, second = second.split('=')
keep.extend(second.split(','))
print(' '.join(keep))
答案 2 :(得分:0)
让我们关注我们要解析的示例字符串:
1 J=1,8
我们有空格,数字,更多空格,一些字符,然后是数字,逗号和更多数字。如果我们用正则表达式字符替换它们,我们会得到(\d+)\s+J=(\d+),(\d+)
,其中+
表示我们需要1个或更多该类型。请注意,我们用括号括起数字,以便稍后我们可以使用.groups()
或.group(#)
捕获它们,其中#是第n组。