Bestimmte Zeichenfolge aus String filtern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
NinoBaumann
User
Beiträge: 80
Registriert: Samstag 25. April 2020, 19:03

Hallo,

ich habe einen String. In diesem steht eine Teilebezeichnung und eine Teilenummer. Die Teilebezeichnung ändert sich immer mal wieder aber der Aufbau der Teilenummer ist immer gleich. Der String sieht wie im Folgenden aus: 'FixJoint 3600 Z34 7759.07.030__Leerzeichen___' ----> brauchen tue ich genau das ----> 7759.07.03
Ich habe es auf folgendem Weg versucht:

Code: Alles auswählen

import re

a='FixJoint 3600 Z34 7759.07.030     '

b=re.findall("\w+\.\w+\.\w+", a)[0]
Also Ergebnis bekomme ich jedoch 7759.07.030 statt 7759.07.03. Also eine Null zu viel. Jetzt könnte ich es so machen:

Code: Alles auswählen

c=b[:-1]
Dann würde ich das richtige Ergebnis bekommen. Aber es gibt auch Strings bei denen es z.B. so ist:

Code: Alles auswählen

a='FixJoint 3200 Z28 7732.07.07     '
Hier würde ich dann das bekommen: 7732.07.0 statt das 7732.07.07.
Also gibt es noch eine elegantere Möglichkeit das zu lösen? Gibt es sowas wie re.findall("\w+\.\w+\.\w+2", a), sodass man ab dem Punkt die nächsten zwei Stellen bekommt? Ich brauche den Code halt in einer Zeile da ich es noch mit .apply in Pandas verwurschtle.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum benutzt Du \w wenn Du doch laut Beispiel nur Ziffern hast?
Warum benutzt Du findall, wenn Du gar nicht alle Treffer möchtest?
Man kann exakt angeben, wie viele Ziffern du möchtest:

Code: Alles auswählen

b=re.search(r"\d{4}\.\d{2}\.\d{2}", a).group(0)
NinoBaumann
User
Beiträge: 80
Registriert: Samstag 25. April 2020, 19:03

Hallo Sirius,

gute Denkanstöße für das nächste Mal. Danke.
NinoBaumann
User
Beiträge: 80
Registriert: Samstag 25. April 2020, 19:03

Sirius3 hat geschrieben: Mittwoch 5. April 2023, 09:52 Warum benutzt Du \w wenn Du doch laut Beispiel nur Ziffern hast?
Warum benutzt Du findall, wenn Du gar nicht alle Treffer möchtest?
Man kann exakt angeben, wie viele Ziffern du möchtest:

Code: Alles auswählen

b=re.search(r"\d{4}\.\d{2}\.\d{2}", a).group(0)
[/quote]

Aber wie kann ich hier das Problem händeln, wenn mal Zellen leer sind. Das gibt es nämlich auch. Da würde mir der Code eine Fehler bringen. Wenn nichts in der Zelle steht, sollte nach der Operation ebenfalls nicht drinnen stehen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

So wie du jeden Fehler behandelst: durch das abfangen einer Ausnahme, oder pruefen auf Plausibilitaet des Rueckgabewertes.
NinoBaumann
User
Beiträge: 80
Registriert: Samstag 25. April 2020, 19:03

Falls noch jemand eine funktionierende Lösung benötigt. So habe ich es in meinem Dataframe gelöst:

Code: Alles auswählen

df['XY'].apply(lambda x: '' if re.search(r"\d{4}\.\d{2}\.\d{2}", str(x)) is None else re.search(r"\d{4}\.\d{2}\.\d{2}", str(x)).group(0))
nach dem aufgetröselten Schema von:

Code: Alles auswählen

import re

#a='FixJoint 3600 Z34 7759.07.030     '
a=''

if re.search(r"\d{4}\.\d{2}\.\d{2}", a) is None:
    print('')
else:
    print(re.search(r"\d{4}\.\d{2}\.\d{2}", a).group(0))
Es gilt wie immer: Funktioniert, geht aber auch mit Sicherheit anders/schöner.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Ach, Du benutzt Pandas. Das wäre natürlich eine Info gewesen, die man sofort gebraucht hätte.
Für Reguläre Ausdrücke gibt es str.extract:

Code: Alles auswählen

import pandas as pd
import io
df = pd.read_csv(io.StringIO("""A\tXY
1\tFixJoint 3600 Z34 7759.07.030     
2\tFixJoint 3200 Z28 7732.07.07     """), sep='\t')
df['XY'].str.extract(r'(\d{4}\.\d{2}\.\d{2})')
Antworten