str.extract

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
st_baum
User
Beiträge: 26
Registriert: Sonntag 24. Mai 2020, 13:54

Es soll der String vor und nach bestimmten zeichen ausgewählt werden. Exemplarisch steht in einer Spalte:

wert: 2, beobachtung: 1,

Alles nach der Zeichenkette "wert:" und vor dem ersten "," soll ausgewählt werden, d.h. "2". Ist mir nicht ganz klar, wie ich das mit str. extract anstelle.
Sirius3
User
Beiträge: 17844
Registriert: Sonntag 21. Oktober 2012, 17:20

Vor allem, weil es gar kein str.extract gibt. Aber Du könntest ja in der Dokumentation nachlesen, welche Methoden Strings wirklich haben, und ob es eine passendere gibt.
Benutzeravatar
__blackjack__
User
Beiträge: 13268
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Oder dazu schreiben das es gar nicht um `str.extract()` geht, sondern um `pandas.Series.str.extract()`.

Das will einen regulären Ausdruck. Was wurde versucht und wie weicht das Ergebnis von den Erwartungen ab? Die API-Dokumentation zur Methode gelesen? Die Dokumentation dazu im „User Guide“? Beides hat auch Beispiele.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
st_baum
User
Beiträge: 26
Registriert: Sonntag 24. Mai 2020, 13:54

Zunächst bitte ich um Entschuldigung für meine schlampige Beschreibung. Richtig, es handelt sich um 'str.extract()' aus Pandas.

Ich glaube es ist erstmal sinnvoll, die richtige regex zu finden und das ganze dann auf den DF zu übertragen:

Code: Alles auswählen

import re
m = re.search(r'(?<=user:")\w+-+\w', 'user:"abc-1d2-12",obs:"1"')
n = re.search(r'(?<=obs:")\w+', 'user:"abc-1d2-12",obs:"1"')
print(m.group(0),n.group(0))
Jetzt müsste ich die regex für m relativ umständlich erweitern, um alles bis zum ' " ' zu erfassen. Geht das einfacher, d.h. etwa sinngemäß wie 'alles bis'
Benutzeravatar
__blackjack__
User
Beiträge: 13268
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Da sind ja gar keine Gruppen definiert. Wenn Du alles zwischen den " haben willst, dann schreib dafür jeweils eine Gruppe nach dem öffnenden " die alles bis auf das schliessende " matcht:

Code: Alles auswählen

In [108]: m = re.search('user:"([^"]*)",obs:"([^"]*)"', 'user:"abc-1d2-12",obs:"1"')

In [109]: m.groups()
Out[109]: ('abc-1d2-12', '1')
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
st_baum
User
Beiträge: 26
Registriert: Sonntag 24. Mai 2020, 13:54

Danke :-)
Antworten