2016-01-23 3 views
5

Ich habe ein Textdokument mit 32 Artikeln und ich möchte das Datum jedes Artikels erkennen. Ich habe beobachtet, dass das Datum in der 5. Reihe jedes Artikels steht. Bisher habe ich den Text in die Verwendung von 32 Artikeln aufgeteilt:Datumsliste im Text

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

Ich werde wie eine Liste erstellen, die das Datum für jeden Artikel, Monat und Jahr nur enthält: enter image description here

Wie es zu sehen ist Das Datum kommt im Format des obigen Bildes, aber manchmal ist der Tag nicht enthalten, z Donnerstag.

Irgendwelche Ideen?

Mit freundlichen Grüßen

Andres

Ps. Hier ist ein weiteres Beispiel für die 16-Dokument: enter image description here

Antwort

1

Mit regex unterhalb der if Anweisung Sie den Tag ersetzen könnte:

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

Beispiel:

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

linecache Methode :

Mit dem Modul linecache können Sie Zeile 5 gezielt erfassen und in eine Datei schreiben; Wenn ein Datum den Wochentag enthält, wird es abgeschnitten. Es ist möglich, mit dieser Funktionalität viel mehr zu tun, obwohl ich die feineren Details Ihnen überlassen werde.

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

Wie würde der Code aussehen? –

+0

Ich erhalte einen Fehler bei den Tabs und Leerzeichen, wenn ich versuche, sie einzufügen. Trotzdem ist die Idee fantastisch, vielen Dank! –

+0

Gern geschehen! Es ist schwer zu sagen, wie die Zeilenformatierung aus dem Bild aussieht, also wenn Sie die ersten 5 Zeilen eines Artikels in Ihre Frage schreiben können, die Ihnen helfen könnten. Was ist der Fehler genau? –

1

Oder Sie finden ein Muster in Ihrer Zeichenfolge mit re. Zum Beispiel:

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

Wenn die Funktion etwas zurückgibt, können Sie die gesamte Zeichenfolge als Datum betrachten.

0

Ich würde die Dateutil.Parser-Bibliothek versuchen. Ich fand es ein wenig peinlich, mit zu arbeiten, aber es ist Aufgabe, Saiten zu nehmen, die wie Daten aussehen und diese Daten in Datumswerte umwandeln. Ich habe es ziemlich kompetent gefunden.

Dokumentation ist here und die gewünschte Funktion ist analysieren() (das heißt dateutil.parser.parse()).