2015-10-20 4 views
3

Я пытаюсь прочитать определенную строку в файлах. В основном файл выглядит следующим образом:Python - поиск определенной строки в файлах

S0M6A36A108A180A252A324A36|1|48|89|36|Single| 
S0M6A36A108A180A252A324A36|2|43|83|108|Single| 
S0M6A36A108A180A252A324A36|3|37|85|180|Single| 
S0M6A36A108A180A252A324A36|4|37|93|252|Single| 
S0M6A36A108A180A252A324A36|5|43|95|324|Single| 
S0M6A36A108A180A252A324A36|6|42|89|36|Single| 

[META DATA] 
01/10/2015|14:50:27|USA|UWI_N2C34_2|MMS1|FORD35|Bednarek|true|6|0|false| 

[QUALITY CAMERA CHECK] 
1|1|0| 
2|1|0| 
3|1|0| 
4|1|0| 
5|1|0| 
6|1|0| 

[PRESET] 
S0M6A36A108A180A252A324A36|TA| 

Что мне нужно читать из строки: 01/10/2015|14:50:27|USA|UWI_N2C34_2|MMS1|FORD35|Bednarek|true|6|0|false| название страны между строкой |USA|

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

import os 
import string 
import re 
import sys 
import glob 
import fileinput 

country_pattern = 'MYS','IDN','ZAF', 'THA','TWN','SGP', 'NWZ', 'AUS','ALB','AUT','BEL', 'BGR', 'BIH', 'CHE','CZE', 'DEU', 'DNK', 'ESP','EST','SRB','MDK','MNE','BIH', 'BIH','MNE','FIN', 'FRA', 'GBR','GRC', 'HRV', 'HUN', 'IRL', 'ITA', 'LIE', 'LTU', 'LUX', 'LVA', 'MDA', 'SMR','CYP','NLD','NOR','POL','PRT','ROU','SCG', 'SVK','SVN','SWE','TUR','BRA','CAN','USA','MEX','CHL','ARG','RUS' 
pattern = r'(\d+)/(\d+)/(\d+)|(\d+):(\d+):(\d+)|(\S+)|(\S+)|(\S+)|(\S+)|(\S+)|(\S+)|(\d+)|(\d+)|(\S+)|' 

src = raw_input("Enter source disk location: ") 
src = os.path.dirname(src) 
for dir,_,_ in os.walk(src): 
    file_path = glob.glob(os.path.join(dir,"*.txt")) 
    for file in file_path: 
    f = open(file, 'r') 
    object_name = f.readlines() 
    f.close() 

    for line_name_tmp in object_name: 
     line_name = line_name_tmp.replace('\n','') 
     if line_name == '': 
      line_name.split() 
      continue 
     else: 
      try: 
       searchObj = re.search(pattern, line_name) 
       m = searchObj.group(7) 
       if m in country_pattern: 
        print "searchObj.group(7) : ", searchObj.group(7) 
       else: 
        print 'did not find any match' 
      except: 
       print line_name 
       pass 

Но он всегда будет печатать меня «не нашел совпадения». Я что-то пропустил ? Спасибо за консультацию.

+3

лично, я прочитал каждую строку в файле, пока я не нашел '[META DATA]', а затем следующую строку. Я разделил бы его 'ls = line.split ('|')' и взял свой третий элемент с 'country = ls [2]' – Pynchia

+0

отличное решение, спасибо :) –

ответ

0

переизбранием проблема попробовать это один

pattern = r'(\d+)/(\d+)/(\d+)\|(\d+):(\d+):(\d+)\|(\S+)\|(\S+)\|(\S+)\|(\S+)\|(\S+)\|(\S+)\|(\d+)\|(\d+)\|(\S+)\|' 
+0

Да это точно, чего я отсутствовал :) –

0

В регулярных выражениях символ | разделяет альтернативы. Так что, если вы определяете регулярное выражение, как это,

(\d+)/(\d+)/(\d+)|(\d+):(\d+):(\d+) 

будет соответствовать строке вида digits/digits/digitsили строки вида digits:digits:digits. Не оба.

Соответственно, когда вы берете pattern регулярное выражение и поиск линии

01/10/2015|14:50:27|USA|UWI_N2C34_2|MMS1|FORD35|Bednarek|true|6|0|false| 

на матч, регулярное выражение завершаться сравниваться только часть 01/10/2015, потому что часть соответствует первой альтернативе ((\d+)/(\d+)/(\d+)). Седьмая группа захвата в регулярном выражении не входит в ту часть, которая соответствует, поэтому m.group(7) возвращает None, и, конечно, None не является одним из элементов в country_pattern.

Легко - или можно сказать, что ленивый способ исправить это, чтобы избежать символов трубы в определении регулярного выражения: используйте \| вместо |. Но поскольку у вас есть поля, разделенные | в файле, я думаю, что у вас может быть более совершенная программа, если вы должны использовать line_name.split('|'), а затем выберите третье поле вместо обычного выражения.

+0

Спасибо, это сработало :) –

0
if need just to find it text country abbreviation this will do it: 

data = ''' 
01/10/2015|14:50:27|USA|UWI_N2C34_2|MMS1|FORD35|Bednarek|true|6|0|false| 
''' 
country_pattern = 'MYS','IDN','ZAF', 'THA','TWN','SGP', 'NWZ', 'AUS','ALB','AUT','BEL', 'BGR', 'BIH', 'CHE','CZE', 'DEU', 'DNK', 'ESP','EST','SRB','MDK','MNE','BIH', 'BIH','MNE','FIN', 'FRA', 'GBR','GRC', 'HRV', 'HUN', 'IRL', 'ITA', 'LIE', 'LTU', 'LUX', 'LVA', 'MDA', 'SMR','CYP','NLD','NOR','POL','PRT','ROU','SCG', 'SVK','SVN','SWE','TUR','BRA','CAN','USA','MEX','CHL','ARG','RUS' 

mo = re.search(r'\|[A-Z]{3}\|',data) 
if mo: 
    print(mo.group(0)) 


|USA| 
+0

Также интересное решение спасибо :) –

Смежные вопросы