2016-01-23 26 views
5

Mam dokument tekstowy z 32 artykułami w nim i chcę zobaczyć datę każdego artykułu. Zauważyłem, że data pojawia się w piątym wierszu każdego artykułu. Do tej pory mam podzielić tekst do 32 artykułów przy użyciu:Lista dat w tekście

import re 
sections = [] 
current = [] 
with open("Aberdeen2005.txt") as f: 
    for line in f: 
     if re.search(r"(?i)\d+ of \d+ DOCUMENTS", line): 
      sections.append("".join(current)) 
      current = [line] 
     else: 
      current.append(line) 

print(len(sections)) 

będę chciał stworzyć listę zawierającą datę dla każdego artykułu, miesiąc i tylko roku: enter image description here

Jak można zauważyć, , data pojawia się w formacie z powyższego zdjęcia, ale czasami nie ma dnia, np Czwartek.

Wszelkie pomysły?

poważaniem,

Andres

Ps. Oto kolejny przykład na 16 dokumentu: enter image description here

Odpowiedz

1

Korzystanie regex pod oświadczeniem if można zastąpić dzień:

regx = re.compile(ur'(\w+\s\d{1,2},\s\d{4})\s\w{6,9}') 
line = re.sub(regx, "\\1", line) 

Przykład:

https://regex101.com/r/pJ0nZ8/1

metoda linecache :

Za pomocą modułu linecache można w szczególności przechwycić wiersz 5 i zapisać go w pliku; jeśli data obejmuje dzień tygodnia, zostanie skrócona. Z tą funkcjonalnością można zrobić o wiele więcej, aczkolwiek pozostawiam ci dokładniejsze szczegóły.

import linecache 

w = 'Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday' 
l = linecache.getline("Aberdeen2005.txt",5) 
m = [d in l for d in w] 
c = '2005','2016' # years (optional) 

if any(y in l for y in c): # check for years (optional) 

    if any(x in l for x in w): 
     r = [i for i,v in enumerate(m,0) if v] 
     l = l.replace(' '+w[r[0]],'') 

    with open("dates.txt", "a") as article_dates: 
     article_dates.write(l) 

linecache.clearcache() 
+0

Jak wyglądałby kod? –

+0

Podczas próby wstawienia pojawia się błąd dotyczący kart i spacji. Mimo to pomysł jest fantastyczny, wielkie dzięki! –

+0

Nie ma za co! Trudno powiedzieć dokładnie, jak wygląda formatowanie liniowe z obrazu, więc jeśli możesz dodać do swojego pytania faktyczne pierwsze 5 linii z artykułu, które mogą pomóc. Czym dokładnie jest błąd? –

1

Lub możesz znaleźć wzór wewnątrz struny za pomocą re. Na przykład:

date1 = 'December 29, 2005 Thursday' 
date2 = 'February 1, 2015' 

re.findall("[A-Za-z]+ [0-9]{1,2}, [0-9]{4}", date1) 
['December 29, 2005'] 

re.findall("[A-Za-z]+ [0-9]{1,2}, [0-9]{4}", date2) 
['February 1, 2015'] 

Jeśli funkcja zwraca coś, można rozważyć cały ciąg jako randkę.

0

Chciałbym przetestować bibliotekę dateutil.parser. Zauważyłem, że praca z nim jest nieco niezręczna, ale zadaniem jest przyjmowanie ciągów, które wyglądają jak daty i przekształcanie tych dat w datetime. Stwierdziłem, że jest dość kompetentny.

Dokumentacja to here, a wybraną funkcją jest funkcja pars() (np. Dateutil.parser.parse()).