Как я могу извлечь два конкретных числа из нескольких строк текстового файла в python

У меня есть очень большой текстовый файл, в котором, скажем, измерения широты с 2 антенн GPS. В файле много мусорных данных, и мне нужно извлечь из него измерения широты. Они всегда иногда встречаются между другими строками другого текста. Строка, в которой они встречаются, выглядит так:

12:34:56.789    78:90:12.123123123  BLAH_BLAH   blahblah    :      LAT #1 MEAS=-80[deg], LAT #2 MEAS=-110[deg]  blah_BlHaBKBjFkjsa.c

Мне нужны числа между "LAT #1 MEAS=-80[deg]" и "LAT #2 MEAS=-110[deg]". Итак, в основном -80 и -110.

Остальной текст для меня не важен.

Вот пример текста из входного файла:

08:59:07.603    08:59:05.798816 PAL_PARR_INTF   TraceModule GET int@HISR :82    drv_Shm.c (../../../PALCommon/Platform_EV/HAL/Common/driver/Shm/src)    525 
08:59:07.603    08:59:05.798816 PAL_PARR_INTF   TraceModule xdma is not running drv_Shm.c (../../../PALCommon/Platform_EV/HAL/Common/driver/Shm/src)    316 
08:59:07.603    08:59:05.798847 PAL_PARR_INTF   TraceModule DMA is activated    drv_Shm.c (../../../PALCommon/Platform_EV/HAL/Common/driver/Shm/src)    461 
08:59:10.847    08:59:09.588001 UHAL_SRCH   TraceFlow   :      LAT #1 MEAS=-80[deg], LAT #2 MEAS=-110[deg]  uhal_CHmcpPschMultiPath.c (../../../HEDGE/UL1/UHAL_3XX/Searcher/Code/Src)   1596    
08:59:11.440    08:59:10.876819 UHAL_COMMON TraceWarning    cellRtgSlot=0 cellRtgChip=1500 CELLK_ACTIVE=1 boundary RSN 232482 current RSN 232482 boundarySFN 508 currentSFN 508 uhal_Hmcp.c (../../../HEDGE/UL1/UHAL_3XX/platform/Code/Src) 2224    
08:59:11.440    08:59:10.877277 UHAL_SRCH   TraceWarning    uhal_HmcpSearcherS1LISR: status_reg(0xf0100000) uhal_CHmcpPschMultiPath.c (../../../HEDGE/UL1/UHAL_3XX/Searcher/Code/Src)   1497    
08:59:11.440    08:59:10.877307 UHAL_COMMON TraceWarning    uhal_HmcpSearcherSCDLISR is called. uhal_CHmcpPschMultiPath.c (../../../HEDGE/UL1/UHAL_3XX/Searcher/Code/Src)   1512    
08:59:11.440    08:59:10.877338 UHAL_SRCH   TraceFlow   :      LAT #1 MEAS=-78[deg], LAT #2 MEAS=-110[deg]  uhal_CHmcpPschMultiPath.c (../../../HEDGE/UL1/UHAL_3XX/Searcher/Code/Src)   1596    

Теперь я использую код, чтобы открыть файл и получить эти значения, но он не работает. Я новичок в программировании, поэтому я понятия не имею, где я ошибаюсь.

import re                                                                       

    # Importing 're' for using regular expressions

file_dir=raw_input('Enter the complete Directory of the file (eg c:\\abc.txt):')    # Providing the user with a choice to open their file in .txt format
with open(file_dir, 'r') as f:
    lat_lines= f.read()                                                            # storing the data in a variable

# Declaring the two lists to hold the numbers
raw_lat1 = []
raw_lat2 = []

start_1 = 'LAT #1 MEAS='
end_1 = '[de'

start_2 = 'LAT #2 MEAS='
end_2 = '[de'

x = re.findall(r'start_1(.*?)end_1',lat_lines,re.DOTALL)
raw_lat1.append(x)

y = re.findall(r'start_2(.*?)end_2',lat_lines,re.DOTALL)
raw_lat2.append(y)

person aabb bbaa    schedule 20.12.2016    source источник


Ответы (2)


Это должно сделать это (оно не использует регулярное выражение, но все равно будет работать)

answer = []
with open('file.txt') as infile:
    for line in infile:
        if "LAT #1 MEAS=" not in line: continue
        if "LAT #2 MEAS=" not in line: continue
        splits = line.split('=')
        temp = [0,0]
        for i,part in enumerate(splits):
            if part.endswith("LAT #1 MEAS"): temp[0] = int(splits[i+1].split(None,1)[0].split('[',1)[0])
            elif part.endswith("LAT #2 MEAS"): temp[1] = int(splits[i+1].split(None,1)[0].split('[',1)[0])
        answer.append(temp)
person inspectorG4dget    schedule 20.12.2016
comment
Спасибо за ответ. Я пробовал это, но это просто дает мне пустой список. на выходе есть только [],[],[],[],[],[],[],[], если я печатаю список «ответов». - person aabb bbaa; 20.12.2016
comment
@uddinM: пожалуйста, отредактируйте свой исходный пост, включив в него образец входного файла, чтобы я мог правильно протестировать - person inspectorG4dget; 20.12.2016
comment
Добавил образец в вопрос. - person aabb bbaa; 20.12.2016
comment
Спасибо. Работает отлично! - person aabb bbaa; 20.12.2016

Есть пара проблем с регулярным выражением, которые я вижу отсюда. В вашем вызове re.findall вы используете start_1 и end_2 так, как если бы они были переменными, но регулярное выражение на самом деле будет рассматривать их просто как необработанные символы "start_1" и "end_1" и т. д. Чтобы использовать переменные в строке регулярного выражения, вы должны вместо этого должны использовать строки формата. Пример:

r'%s(.*?)%s' % (start_1, end_1)

Кроме того, когда вы используете .*end_1, это будет соответствовать любому символу, поэтому он будет соответствовать всем символам до последнего появления end_1 в строке. И LAT #1, и LAT #2 заканчиваются одинаково, поэтому, если бы все остальное в строке было правильным, это фактически соответствовало бы `"-80[deg], LAT #2 MEAS=-110[de"

Кроме того, при использовании квадратных скобок в регулярном выражении их необходимо экранировать. Буквенные скобки используются для указания набора символов в регулярных выражениях.

Вот пример, в котором я просто предполагаю, что переменная line содержит вашу тестовую строку "12:34:56.789 78:90:12.123123123 BLAH_BLAH blahblah : LAT #1 MEAS=-80[deg], LAT #2 MEAS=-110[deg] blah_BlHaBKBjFkjsa.c". Возможно, вам придется настроить этот фрагмент для всего файла.

prefix = r'LAT %s MEAS=(-?\d+)\[deg\]' # includes format string for the variable part of the expression.
p1 = r'#1'
p2 = r'#2
x = re.findall(prefix % p1, line)
y = re.findall(prefix % p2, line)
person xgord    schedule 20.12.2016