2017-12-30 67 views
-1

Ich versuche, 6-stellige Zahlen in Texten eingebettet zu extrahieren. Die Zahlen beginnen immer mit einer Null, sind immer 6 Ziffern durch eine Periode nach der 4. Stelle getrennt lang, etwa so:regex findall für Zahlen

0 0133.02[text] in location [texttext](text) numbers 1 0121.08[text] in location [texttext](text) numbers ...

Ich betreibe die folgenden:

import re filtered = re.findall("0\d\d\d[.]\d\d", str(df['col']))

Es gibt 478 zu analysierende Zeilen, und jede Zeile enthält die genannte Nummer. Allerdings gibt das filtered Ergebnis immer nur 60 aus, auch wenn ich das Regex-Format ändere. Interessanterweise scheint filtered hauptsächlich aus Zahlen der ersten und letzten Reihen der 478 Reihen zusammengesetzt zu sein, aber nicht aus der Mitte?

EDIT: Ich extrahierte die Zeilen, die funktionieren vs nicht funktionieren, und festgestellt, dass diejenigen, die funktionieren, sind die ersten & letzten 30 Zeilen (0-29, 448-477).

Hier ist eine Probe der Zeilen, die nicht funktionieren (446, 447): 446 0005.00 [CT] in Vancouver [CMA] (B.C.) 44160 447 0170.05 [CT] in Vancouver [CMA] (B.C.) 44006

Und eine Probe der Zeilen, die funktionieren (448, 449): 448 0050.04 [CT] in Vancouver [CMA] (B.C.) 43995 449 0067.01 [CT] in Vancouver [CMA] (B.C.) 43989

+1

Schwer zu sehen, was falsch ist, ohne zu sehen die Daten. Deine Regex sollte funktionieren. – L3viathan

+0

Ist Ihre Frage zu diesem Thema? https://stackoverflow.com/questions/15325182/how-to-filter-rows-in-pandas-by-regex – Mehdi

+0

versuchen Sie "\ d + \.? \ d *" und sehen Sie die Anzahl der Ergebnisse. Möglicherweise stimmen einige Ihrer Elemente nicht mit Ihrem erwarteten Format überein. –

Antwort

1

Diese manche Dinge, die Ihnen helfen, dies zu lösen. Ich werde das entfernen, da es keine Antwort ist.

import re 
import pandas as pd 

data = dict(col=['texttexttext 0036.01 texttext','texttexttext 0006.21 texttext']) 
df = pd.DataFrame(data) 

re.findall("0\d{3}\.\d{2}", str(df['col'])) #Simplified your regex 

effektiv erstellt:

['0036.01', '0006.21'] 

Wie wäre es damit versuchen:

re.findall("0\d{3}\.\d{2}",' '.join(df['col'].tolist())) 

Und wenn mittleren Reihen nicht arbeiten, um eine Probe extrahieren, beispielsweise und mit anderen teilen, die bei uns:

print('\n'.join(df['col'][200:220].tolist())) 
+0

danke für den Vorschlag, ich bearbeitet den Beitrag, um Beispiel der Zeilen, die nicht funktionieren – eh2699

+0

@ eh2699 seltsam .. was ist, wenn Sie die Funktion ".join() statt? –

+0

das hat funktioniert !! Es tut mir leid, aber ich bin neu in Python, können Sie einen Moment nehmen? - Was macht Join(), damit es funktioniert, dass das nicht verwendet? – eh2699