2016-05-27 19 views
7

Ho una lista di testo in formato token (list_of_words) che sembra qualcosa di simile:Come rimuovere date da una lista in Python

list_of_words = 
['08/20/2014', 
'10:04:27', 
'pm', 
'complet', 
'vendor', 
'per', 
'mfg/recommend', 
'08/20/2014', 
'10:04:27', 
'pm', 
'complet', 
...] 

e sto cercando per togliere tutte le istanze di date e orari da questa lista. Ho provato a utilizzare la funzione .remove(), senza alcun risultato. Ho provato a passare caratteri jolly, come "../../...." a un elenco di stopword con cui stavo ordinando, ma non ha funzionato. Alla fine ho provato a scrivere il seguente codice:

for line in list_of_words: 
    if re.search('[0-9]{2}/[09]{2}/[0-9]{4}',line): 
     list_of_words.remove(line) 

ma anche questo non funziona. Come posso rimuovere tutto dal mio elenco formattato come una data o un'ora?

+2

C'è un particolare formato di dati e/o tempo che vuoi rimuovere? – mng

risposta

6

Descrizione

^(?:(?:[0-9]{2}[:\/,]){2}[0-9]{2,4}|am|pm)$ 

Regular expression visualization

Questa espressione regolare farà le seguenti:

  • stringhe trovare quale sembrano date 12/23/2016 e orari 12:34:56
  • stringhe trovare quale sono anche anche am o pm che probabilmente fanno parte del tempo precedente nell'elenco sorgente

Esempio

Live Demo

Lista Esempio

08/20/2014 
10:04:27 
pm 
complete 
vendor 
per 
mfg/recommend 
08/20/2014 
10:04:27 
pm 
complete 

List dopo l'elaborazione

complete 
vendor 
per 
mfg/recommend 
complete 

Esempio Script Python

import re 

SourceList = ['08/20/2014', 
       '10:04:27', 
       'pm', 
       'complete', 
       'vendor', 
       'per', 
       'mfg/recommend', 
       '08/20/2014', 
       '10:04:27', 
       'pm', 
       'complete'] 

OutputList = filter(
    lambda ThisWord: not re.match('^(?:(?:[0-9]{2}[:\/,]){2}[0-9]{2,4}|am|pm)$', ThisWord), 
    SourceList) 


for ThisValue in OutputList: 
    print ThisValue 

Spiegazione

NODE      EXPLANATION 
---------------------------------------------------------------------- 
^      the beginning of the string 
---------------------------------------------------------------------- 
    (?:      group, but do not capture: 
---------------------------------------------------------------------- 
    (?:      group, but do not capture (2 times): 
---------------------------------------------------------------------- 
     [0-9]{2}     any character of: '0' to '9' (2 times) 
---------------------------------------------------------------------- 
     [:\/,]     any character of: ':', '\/', ',' 
---------------------------------------------------------------------- 
    ){2}      end of grouping 
---------------------------------------------------------------------- 
    [0-9]{2,4}    any character of: '0' to '9' (between 2 
          and 4 times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
    |      OR 
---------------------------------------------------------------------- 
    am      'am' 
---------------------------------------------------------------------- 
    |      OR 
---------------------------------------------------------------------- 
    pm      'pm' 
---------------------------------------------------------------------- 
)      end of grouping 
---------------------------------------------------------------------- 
    $      before an optional \n, and the end of the 
          string 
---------------------------------------------------------------------- 
+2

Questa è una delle migliori risposte spiegate che ho trovato in un attimo! – minocha

6

se si desidera che la matematica l'ora e la stringa di data nella vostra lista, forse si può provare qui sotto regex:

[0-9]{2}[\/,:][0-9]{2}[\/,:][0-9]{2,4} 

enter image description here

aggiungere il codice Python:

import re 

list_of_words = [ 
'08/20/2014', 
'10:04:27', 
'pm', 
'complet', 
'vendor', 
'per', 
'mfg/recommend', 
'08/20/2014', 
'10:04:27', 
'pm', 
'complet' 
] 
new_list = [item for item in list_of_words if not re.search(r'[0-9]{2}[\/,:][0-9]{2}[\/,:][0-9]{2,4}', item)] 
+0

La tua espressione regolare è ottima. L'ho usato nella mia risposta. –

+2

@ user6188402 \ d controlla tutte le cifre Unicode, mentre [0-9] è limitato a questi 10 caratteri. quindi [0-9] è più efficiente – bertramlau

+0

Sarebbe più pulito e più efficiente usare 're.compile' e quindi accedere all'espressione compilata. – 2Cubed

1

Prova questa :

import re 

list_of_words = ['08/20/2014', 
       '10:04:27', 
       'pm', 
       'complet', 
       'vendor', 
       'per', 
       'mfg/recommend', 
       '08/20/2014', 
       '10:04:27', 
       'pm', 'complet'] 

list_of_words = filter(
    lambda x: not re.match('[0-9]{2}[\/,:][0-9]{2}[\/,:][0-9]{2,4}', x), 
    list_of_words) 
Problemi correlati