2013-08-29 34 views
9

\ s ile arama yapın veya '\ n' aramak için çalışıyorum çok satırını bulamıyorum. Kaynakre.search Çok satırlı Python

Porsiyon:

Tam Kod

lines = open('scan.txt','r').readlines() 
for a in lines: 
    if re.search(r"\A\d", a): 
     digits = a 
     if re.search(r"2013", digits): 
      date.append(digits[:19]) 
      count +=1 
     elif re.search(r",", digits): 
      clean = digits.rstrip() 
      sector = clean.split(',') 
      x.append(sector[0]) 
      y.append(sector[1]) 
    elif re.search(r"CONTROLLED BY:", a): 
     player.append(a[15:].rstrip()) 
    elif re.search(r"ALLIANCE:", a): 
     alliance.append(a[10:].rstrip()) 
    elif re.search(r"SIZE:", a): 
     size.append(a[6:].rstrip()) 
    elif re.findall('BUILDING DATA:\sN/A', a, re.M): 
     def_grid = '' 
     print "Didn't find it" 
     defense.append(def_grid) 
     defense_count +=1 
    elif re.search(r"DEFENSE GRID", a): 
     def_grid = a[16:].rstrip() 
     print "defense found" 
     defense_count +=1 

Ama hiçbir şey iade sahip değilim:

Date/Time: 
2013-08-27 17:05:36 

----- BEGIN SEARCH ----- 

GENERAL DATA: 
NAME: AB12 
SECTOR: 
999,999 
CONTROLLED BY: Player 
ALLIANCE: Aliance 
ONLINE: 1 seconds ago 
SIZE: Large 
HOMEWORLD: NO 
APPROVAL RATING: 100% 
PRODUCTION RATE: 100% 

RESOURCE DATA: 
POWER: 0/0 
BUILDINGS: 0/20 
ORE: 80,000/80,000 
CRYSTAL: 80,000/80,000 
POPULATION: 40,000/40,000 

BUILDING DATA: 
N/A 

UNIT DATA: 
WYVERN(S): 100 

----- END SEARCH ----- 

Not Defteri'nde bakarsak ++ I "(LF) YAPI DATA" bakın .

ben "SAVUNMA GRID" "YAPI VERİ:" dan sonra var olmayan biriyle boş bir ara parçasını koymak gerekir

Ben bir şey eksik biliyorum ve re.search üzerinde okuma denedim ama Çok satırlı çalışmanın nasıl çalıştığını açıklayan kapsamlı örnekler bulamıyorum.

+1

A [sscce] (http://sscce.org/) güzel olurdu. Sorunun tam olarak ne olduğunu anlayabilmek zor… –

+0

'import re' 'yi unuttuğunuzu ve bu örneğin kutudan çıkmadığını düşünüyorum. tarih tanımlı değil ... –

cevap

3

Ne yaptığını sadece ne, ama re.search yerine re.findall kullanarak yapabilirsiniz:

re.findall('BUILDING DATA:\nN/A', a, re.M) 
#['BUILDING DATA:\nN/A'] 

DÜZENLEME:

sorun şu anda satır-satır okuma olmasıdır. gerçekleştirmek için s kullanmak sonra lines o kadar büyükse

s = ''.join(lines) 

Tamam ve: İki veya daha fazla satıra ait bir modeli tespit etmek üzere, bir bütün olarak dize, belki yaptığını düşünmek zorundayız sizin çok hatlı hiçbir şey geri döndü neden

+0

Çalıştığım şeyin daha fazlasını ekledim. Re.findall yardım etmedi. – Xariec

+0

@Xariec wow! Sen çok değiştin! Ben bir göz atacağım ... –

+0

lol, sadece benim için basit bir sözdizimi hatası olacak diye düşündüm ... Nasıl kullanmaya çalıştığımı açıklamak için geri kalanı eklemeye karar verdim ... – Xariec

6
re.findall("BUILDING DATA:\nN/A",a,re.MULTILINE) 
1

acaba ... arar. Dosyanız bu gibiyse

BUILDING DATA: 
N/A 

Ben

import re 
f = open('test.txt','r') 
a = f.read(20) 
re.search('BUILDING DATA:\nN/A', a, re.M) 

bir çıkış kullanarak olsun. Ben dizeyle re.search test ederseniz bu

<_sre.SRE_Match object at 0x1004fc8b8> 

, yani bu kodda gibi dosyada değil: beklendiği gibi

import re 
f = open('test.txt','r') 
a = f.read(20) 
re.search('BUILDING BATA:\nN/A', a, re.M) 

hiçbir çıkış yoktur.

DÜZENLEME: Saullo Castro belirttiği gibi, sorun line-by-line okuma

olduğunu. Neden böyle bir şey kullanmıyorsunuz?

a = open('scan.txt','r').read() 
if re.findall('BUILDING DATA:\nN/A', a, re.M): 
    print('found!') 

3 deneyin:

tmp = False 
... 
elif re.findall('BUILDING DATA:', a, re.M): 
    tmp = True 
elif tmp and re.findall('N/A', a, re.M): 
    def_grid = '' 
    print "Didn't find it" 
    defense.append(def_grid) 
    defense_count +=1 
+0

Evet, yazdınız, Not Defteri'nde, metin gönderdiğiniz gibi görünmüyor. 'YAPI BİLGİSİ: (LF) \ nN/A' aramayı denediniz mi? Görünüşe göre kodlama nedeniyle bazı problemler var. –

+1

+1 iyi bir nokta '.read()' kullanarak, ancak OP'nin algoritmasının yapılandırıldığı şekilde işe yaramayabilir, fakat bu kesinlikle '' '.join (çizgiler)' den daha iyi bir yaklaşımdır. –

+0

Hmm .... Çizgiyi okuyordum çünkü hattın parçalarını dışarı çekmem ve bir listeye koymam gerekiyor ve hattın yerine ihtiyacım var. Ayrıca, (bazen BİNA VERİLERİ: \ nN/A ve bazen DEFENSE GRID içerir) bir durum etrafında çalışıyorum Daha sonra kullanmak için her şeyi bir db içine ekleme. Anahtarları sabit tutmaya ihtiyaç duyduğundan, orada olduğu zamanlar kadar orada olmayanları da saymaya ihtiyacım var. – Xariec

0

değiştirin

re.findall('BUILDING DATA:\sN/A', a, re.M): 

re.findall('BUILDING DATA:\nN/A', a, re.M): 

veya

ile

ve çalışması gerekir.

(yani kodunuzda \s yerine \n var dikkat edin)