2013-08-29 10 views
9

re.search con \ s o '\ n' non sta trovando la multilinea che sto cercando di cercare.re.search Linee multiple Python

Porzione di Fonte:

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 ----- 

Guardando in Notepad ++ vedo "DATI STRUTTURALI: (LF)"

pieno Codice

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 

Ma io non sto avendo nulla restituito .

ho bisogno di mettere un distanziatore vuoto quando "Defense Grid" non esiste dopo "DATI EDIFICIO:"

So che mi manca qualcosa e ho provato leggendo su re.search ma Non sono in grado di trovare esempi approfonditi che spieghino come funziona la multilinea.

+1

A [sscce] (http://sscce.org/) sarebbe bello. È difficile capire quale sia esattamente il problema. –

+0

Penso che ti sia dimenticato di "import re" e questo esempio non funziona immediatamente. la data non è stata definita ... –

risposta

3

Si può fare solo quello che hai fatto, ma utilizzando re.findall invece di re.search:

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

EDIT:

Il problema è che si sta leggendo riga per riga. Al fine di individuare un modello che appartiene a due o più linee, è necessario considerare la stringa nel suo insieme, magari facendo:

s = ''.join(lines) 

che è ok se lines non è così grande, e quindi utilizzare s per eseguire le tue ricerche su più righe ...

+0

Ho aggiunto più di ciò su cui stavo lavorando. La refindall non sembrava aiutare. – Xariec

+0

@Xariec Eeeek !!! sei cambiato molto! Avrò uno sguardo ... –

+0

lol, ho pensato che sarebbe stato un semplice errore di sintassi da parte mia ... Ho deciso di aggiungere il resto per spiegare come sto cercando di usarlo ... – Xariec

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

Mi chiedo perché non hai restituito nulla. Se il file è simile al seguente:

BUILDING DATA: 
N/A 

ottengo utilizzando

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

un'uscita. Questo è

<_sre.SRE_Match object at 0x1004fc8b8> 

Se risulto re.search con lo spago, che non è nel file come in questo codice:

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

non c'è uscita come previsto.

EDIT:

Come Saullo Castro ha sottolineato, il problema è la lettura riga per riga. Perché non usare qualcosa come questo?

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

3 ° prova:

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

Sì, hai scritto, che nel Blocco note il testo non ha l'aspetto che hai postato. Hai provato a cercare 'DATI DI COSTRUZIONE: (LF) \ nN/A'? Mi sembra che ci sia qualche problema dovuto alla codifica. –

+1

+1 punto buono usando '.read()', ma nel modo in cui l'algoritmo dell'OP è strutturato potrebbe non funzionare, ma questo è sicuramente un approccio migliore di ''' .join (righe)' dopo averli letti ... –

+0

Hmm .... Stavo leggendo la riga perché ho bisogno di estrarre parti della linea e metterle in una lista e ho bisogno della posizione della linea. Inoltre, sto lavorando a una situazione in cui (a volte i suoi DATI DI COSTRUZIONE: \ nN/A, ea volte include la GRIGLIA DI DIFESA) Inserendo tutto in un db per un uso successivo. È necessario mantenere le chiavi coerenti, quindi ho bisogno di contare le volte che non è così come quando è lì. – Xariec

0

Sostituire

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

con

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

o

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

e dovrebbe funzionare.

(Si noti che nel codice non c'è \s invece di \n)

Problemi correlati