2016-05-27 18 views
7

Mam listę tekstowych tokenized (list_of_words), który wygląda mniej więcej tak:Jak usunąć termin z listy w Pythonie

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

i staram się rozebrać wszystkie instancje datami i czasem z tej listy. Próbowałem użyć funkcji .remove(), bez rezultatu. Próbowałem przekazywać znaki wieloznaczne, takie jak "../../...." do listy słów, które sortowałem, ale to nie zadziałało. W końcu próbowałem napisać następujący kod:

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

ale to też nie działa. Jak mogę usunąć wszystko z datą sformatowaną na podstawie daty lub czasu?

+2

Czy istnieje szczególności Format danych i/lub czasu, który chcesz usunąć? – mng

Odpowiedz

6

Opis

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

Regular expression visualization

To wyrażenie regularne będzie wykonaj następujące czynności:

  • ciągi znalezienia które wyglądają jak terminach 12/23/2016 i czasów 12:34:56
  • smyczki znalezienia które również są również am lub pm, które prawdopodobnie stanowią część poprzedniego czasu na liście źródłowej

Przykład

żywo Demo

Przykładowa lista

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

Lista po przetworzeniu

complete 
vendor 
per 
mfg/recommend 
complete 

Próbka Python Script

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 

Wyjaśnienie

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

Jest to jedna z najlepiej wyjaśnionych odpowiedzi, na które natknąłem się od jakiegoś czasu! – minocha

6

jeśli chcesz matematyka czas i datę ciąg na liście, może można spróbować poniżej regex:

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

enter image description here

dodać kod Pythona:

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

Twój regularny wyraz jest świetny. Użyłem go w mojej odpowiedzi. –

+2

@ user6188402 \ d sprawdza wszystkie cyfry Unicode, a [0-9] jest ograniczone do tych 10 znaków. więc [0-9] jest bardziej wydajny – bertramlau

+0

Byłoby czystsze i bardziej wydajne użycie 're.compile', a następnie dostęp do skompilowanego wyrażenia. – 2Cubed

1

Wypróbuj :

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) 
Powiązane problemy