Seite 1 von 1

Bestimmte Zeichenfolge aus String filtern

Verfasst: Mittwoch 5. April 2023, 09:46
von NinoBaumann
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.

Re: Bestimmte Zeichenfolge aus String filtern

Verfasst: Mittwoch 5. April 2023, 09:52
von Sirius3
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)

Re: Bestimmte Zeichenfolge aus String filtern

Verfasst: Mittwoch 5. April 2023, 10:10
von NinoBaumann
Hallo Sirius,

gute Denkanstöße für das nächste Mal. Danke.

Re: Bestimmte Zeichenfolge aus String filtern

Verfasst: Mittwoch 5. April 2023, 10:25
von NinoBaumann
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.

Re: Bestimmte Zeichenfolge aus String filtern

Verfasst: Mittwoch 5. April 2023, 10:28
von __deets__
So wie du jeden Fehler behandelst: durch das abfangen einer Ausnahme, oder pruefen auf Plausibilitaet des Rueckgabewertes.

Re: Bestimmte Zeichenfolge aus String filtern

Verfasst: Mittwoch 5. April 2023, 10:48
von NinoBaumann
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.

Re: Bestimmte Zeichenfolge aus String filtern

Verfasst: Mittwoch 5. April 2023, 10:57
von Sirius3
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})')