2016-04-12 44 views
0

Yaklaşık 80 000 satırlık bir .asc dosyası var ve dosyadan belirli satırları çıkarmak istiyorum.'two' İki düzenli ifade arasındaki düzenli ifade

Bilgi/satır çıkarmak istediğim alanları (150 alan) belirli satırlara (bir öncekinden ve bir sonra) koyarak daha kolay hale getirmeye çalıştım.

'start' regex (MSG\s*(\d{1,8})\sSHOWING\sSENTENCE) yüzden bu 'start' regex tekrar görünür kadar şey iade olmaz meydana yüzden bu meydana

'end' regex (MSG\s*(\d{1,8})\sSENTENCE\sGONE) sonra hatlar için bakmak istiyorum.

Orada bu iki regex ifadeleri arasındaki çizgilerin yüzlerce olabilir, ama ben yalnızca eşleşen olanlar isteyeceksiniz bu düzenli ifade en Python içinde bu konuda giderdim nasıl

(EFIX\sR\s*(\d{1,8})\s*(\d{1,8})\s*(\d{1,3})\s*(\d{1,3}).\d\s*(\d{1,3}).\d\s*(\d{1,4}) or (ESACC\sR\s*(\d{1,8})\s*(\d{1,8})\s*(\d{1,3})\s*(\d{1,3}).\d\s*(\d{1,3}).\d\s*(\d{1,4}). 

?

+0

Burada yakut benzer bir Q & A var: http://stackoverflow.com/questions/17457440/ruby-line-by-li ne-match-range Ruby, .. operatörünü destekler. Python'da bir döngüde kodlamanız gerekir. Ancak aynı Soru-Cevap, bunun için de örnekler içeriyor. –

+0

"EFIX ..." deseninde, herhangi bir tek karakterle eşleşen bir nokta veya nokta olan '. – Quinn

+0

Bu tam anlamıyla bir nokta yes (@ccf). Ben typicall şuna benzer: ESACC R 1075390 144,3 \t 526,2 \t 54,3 \t 547,2 \t 1,86 \t 162 –

cevap

0

Kolayca aşağıdaki adımlarla yapılabilir: 'start' regex ve 'end' regex desenleri arasında

  1. Yakalama içeriği;
  2. maç: (EFIX\sR\s*(\d{1,8})\s*(\d{1,8})\s*(\d{1,3})\s*(\d{1,3})\.\d\s*(\d{1,3})\.\d\s*(\d{1,4}) or (ESACC\sR\s*(\d{1,8})\s*(\d{1,8})\s*(\d{1,3})\s*(\d{1,3})\.\d\s*(\d{1,3})\.\d\s*(\d{1,4})\.

Yani örnek kod olabilir:

import re 

P1 = 'MSG\s*\d{1,8}\sSHOWING\sSENTENCE([\s\S]+?)MSG\s*\d{1,8}\sSENTENCE\sGONE' 
P2 = 'EFIX\sR\s*\d{1,8}\s*\d{1,8}\s*\d{1,3}\s*\d{1,3}\.\d\s*\d{1,3}\.\d\s*\d{1,4}|ESACC\sR\s*\d{1,8}\s*\d{1,8}\s*\d{1,3}\s*\d{1,3}\.\d\s*\d{1,3}\.\d\s*\d{1,4}\.' 
sample = """ 
ESACC R 000000 7777 333.3 222 1111. 
MSG 2355688 SHOWING SENTENCE 
some text in between 
EFIX R 5656 7878 123 456.8 122.9 5656 
some text 1 here 
some text 2 here 
ESACC R 1075390 1075414 25 144.3 526.2 54.3 547.2 1.86 162 
some text 3 here 
some text 4 here 
EFIX R 1212 505050 222 000.2 129.9 1010 
some text 1 here 
some text 2 here 
ESACC R 1212 505050 222 000.2 129.9 1010. 
some text 3 here 
some text 4 here 
MSG 2355688 SENTENCE GONE 
EFIX R 5555555 8888888 9 666.6 999.8 0000 
""" 
in_between = re.findall(P1, sample) 
for txt in in_between: 
    print re.findall(P2, txt) 

Çıktı:

['EFIX R 5656 7878 123 456.8 122.9 5656', 'ESACC R 1075390\t1075414\t25\t144.3\t526.2\t54.', 'EFIX R 1212 505050 222 000.2 129.9 1010', 'ESACC R 1212 505050 222 000.2 129.9 1010.']