Я пытаюсь реализовать скрипт Python для чтения и извлечения строк из текстового файла ASCII.Это кажется довольно простой вещью, однако я столкнулся с проблемой, которую не могу решить сам.Файл, который я пытаюсь прочитать, содержит тест, и некоторые строки начинаются с *tr999
.В этом шаблоне могут быть как большие, так и маленькие буквы, количество цифр и присутствие *
необязательно.Звездочка также может быть до и после.За этим сигнальным ключевым словом следуют цифры, либо int, либо folat.Чтобы поймать сигнал, я использую выражение регулярного выражения python
re.search("[*]{0,1}[Tt][Rr][0-9]{1,5}[*]{0,1}",line)
Текстовый файл выглядит следующим образом
tr10* 1 2 3 22 1 1 13 12 33 33 33
*Tr20 12 22 -1 2 2 2 5 5 5 6 6 6 77
Tr20 1 1 1 &
2 0 0
1 1 1
2 2 2
c that is a comment and below is the problem case '&' is missing
*tr22221 2 2 2
1 1 1
2 2 2
Код, который я написал, не может поймать последний случай.Где отсутствует сигнал продолжения линии &
.Использование &
для продолжения строки не является обязательным и может быть заменено несколькими пробелами в начале продолжения строки.
Код, который я написал:
import sys
fp=open(sys.argv[1],'r')
import re
# get the integers only
def loop_conv(string):
conv=[]
for i in string.split(" "):
try:
conv.append(float(i))
except ValueError:
pass
return conv
# extract the information
def extract_trans_card(line,fp):
extracted=False
if len(line)>2 and not re.search("[cC]",line.split()[0]) and re.search("[*]{0,1}[Tt][Rr][0-9]{1,5}[*]{0,1}",line) :
extracted=True
trans_card=[]
trans_card.append(line.split()[0])
line_old=line
# this part here is because after the read signal,
# data to be extracted might be on the same line
for val in loop_conv(line):
trans_card.append(val)
# this part here fails. I am not able to catch the case '&' missing.
# i tried to peek the next line with seek() but it i got a system error.
# the idea is to loop until i have a continue line case
while (re.search("^(\s){5,60}",line) or re.search("[&$]",line_old)) and len(trans_card) <13:
line=fp.readline()
for val in loop_conv(line):
trans_card.append(val)
line_old=line
#print('M',trans_card)
print('value',trans_card)
trans_card=[]
return extracted
# read the file with a loop
for line in fp:
if not extract_trans_card(line,fp) :
print(line,end='')
вывод:
value ['tr10*', 1.0, 2.0, 3.0, 22.0, 1.0, 1.0, 13.0, 12.0, 33.0, 33.0, 33.0]
value ['*Tr20', 12.0, 22.0, -1.0, 2.0, 2.0, 2.0, 5.0, 5.0, 5.0, 6.0, 6.0, 6.0, 77.0]
value ['Tr20', 1.0, 1.0, 1.0, 2.0, 0.0, 0.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0]
c that is a comment and below is the problem case '&' is missing
value ['*tr22221', 2.0, 2.0, 2.0]
1 1 1
2 2 2
Последняя строка - это проблема.Поскольку 1 1 1
и 2 2 2
игнорируются и просто отражаются.Эта проблема похожа на то, как Python продолжает линию.Либо по пробелам, либо по &
.Я надеюсь, что кто-то поможет нам с этим и укажет правильный способ решения этой проблемы