2013-02-21 11 views
7

Tratto dalla documentazione, il seguente è un frammento che mostra come funziona la ricerca del metodo regex e conferma che restituisce una lista.Python: il findex di Regex restituisce un elenco, perché il tentativo di accedere all'elemento list [0] restituisce un errore?

re.findall(r"\w+ly", text) 
['carefully', 'quickly'] 

Tuttavia il seguente frammento di codice genera un errore di limite (IndexError: list index out of range) quando si tenta di accedere all'elemento zero della lista restituita da findall.

Rilevante frammento di codice:

population = re.findall(",([0-9]*),",line) 
x = population[0] 
thelist.append([city,x]) 

Perché accade questo?

Per alcuni più di fondo, ecco come quel frammento si inserisce in tutta la mia sceneggiatura:

import re 

thelist = list() 
with open('Raw.txt','r') as f: 
    for line in f: 
     if line[1].isdigit(): 
      city = re.findall("\"(.*?)\s*\(",line) 
      population = re.findall(",([0-9]*),",line) 
      x = population[0] 
      thelist.append([city,x]) 

with open('Sorted.txt','w') as g: 
    for item in thelist: 
     string = item[0], ', '.join(map(str, item[1:])) 
     print string 

EDIT: Leggi commento qui sotto per alcuni retroscena sul perché questo è accaduto. La mia soluzione rapida era:

if population: 
     x = population[0] 
     thelist.append([city,x]) 
+3

L'espressione regolare non corrisponde sempre e restituire un elenco vuoto talvolta – JBernardo

+0

Esecuzione quel frammento indipendente sul guscio Python indica che lo fa. Viene utilizzato anche lo stesso file di input. – Louis93

+1

ovviamente non per * tutte * le linee. –

risposta

11

re.findall restituirà un elenco vuoto se non ci sono gli incontri:

>>> re.findall(r'\w+ly', 'this does not work') 
[] 
3

re.findall può restituire un elenco vuoto nel caso in cui non vi era alcuna corrispondenza. Se provi ad accedere a [][0] vedrai che IndexError.

Per tener conto di nessuna corrispondenza, si dovrebbe usare qualcosa sulla falsariga di:

match = re.findall(...) 
if match: 
    # potato potato 
1

Ho avuto questo stesso problema. La soluzione sembra molto semplice, e non so perché non stavo considerando.

if match: 

anziché

if match[0]: 
Problemi correlati