Namen mir Regex auslesen ?

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
Robertsche
User
Beiträge: 7
Registriert: Sonntag 7. Februar 2021, 21:19

moin,

ich möchte gerne einen Namen mit Regex finden. z.b.

Firma
Max Mustermann
Musterstr. 8
12345 Musterstadt

folgendes habe ich gemacht.

Code: Alles auswählen

(?<=Herr|Frau|Firma)([\D|\s]+\D)
wie bekommt man es hin das mir nur die zeile mit dem Namen angezeigt wird so wie es jetzt ist liest er ja alles bis zur Hausnummer !
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Robertsche: Schon wieder so ein Lookbehind — arbeite Dich mal in die Regex-Grundlagen ein und verwende solche Extrawürste nur wenn die wirklich nötig sind.

Zumal das hier als Lookbehind auch überhaupt nicht funktioniert weil da alle Alternativen die gleiche Länge haben müssen:

Code: Alles auswählen

In [3]: re.compile("(?<=Herr|Frau|Firma)([\D|\s]+\D)")                          
---------------------------------------------------------------------------
error                                     Traceback (most recent call last)
<ipython-input-3-af5abb459c56> in <module>
----> 1 re.compile("(?<=Herr|Frau|Firma)([\D|\s]+\D)")

/usr/lib/python3.6/re.py in compile(pattern, flags)
    231 def compile(pattern, flags=0):
    232     "Compile a regular expression pattern, returning a pattern object."
--> 233     return _compile(pattern, flags)
    234 
    235 def purge():

/usr/lib/python3.6/re.py in _compile(pattern, flags)
    299     if not sre_compile.isstring(pattern):
    300         raise TypeError("first argument must be string or compiled pattern")                                                                            
--> 301     p = sre_compile.compile(pattern, flags)
    302     if not (flags & DEBUG):
    303         if len(_cache) >= _MAXCACHE:

/usr/lib/python3.6/sre_compile.py in compile(p, flags)
    564         pattern = None
    565 
--> 566     code = _code(p, flags)
    567 
    568     # print(code)

/usr/lib/python3.6/sre_compile.py in _code(p, flags)
    549 
    550     # compile the pattern
--> 551     _compile(code, p.data, flags)
    552 
    553     code.append(SUCCESS)

/usr/lib/python3.6/sre_compile.py in _compile(code, pattern, flags)
    158                 lo, hi = av[1].getwidth()
    159                 if lo != hi:
--> 160                     raise error("look-behind requires fixed-width pattern")
    161                 emit(lo) # look behind
    162             _compile(code, av[1], flags)

error: look-behind requires fixed-width pattern
Womit sich dann auch gleich die Frage stellt woher Du weisst was das Muster matcht und was nicht, denn ausprobiert hast Du es offenbar nicht. Das wäre aber auch ein wichtiger Schritt bei der Problembeschreibung.

Dann bedeutet "[\D|\s]" ziemlich sicher nicht das was Du denkst was es bedeutet. Man hätte beispielsweise auch "[\D\s|]" schreiben können; das bedeutet das gleiche. Mal davon ausgehend verstehe ich auch nicht so recht warum nach dem ersten Teilausdruck beliebige Ziffern und Whitespaces kommen dürfen sollten. Das Muster würde ja auch auf Zeichenketten zutreffen die mit "Herr3 42 23" anfangen.

Buchstaben triff das auch nicht, also zu der 8 kann man gar nicht kommen wie Du sagst.

So ganz grundsätzlich und allgemein würde ich sagen das geht gar nicht. Du müsstest einen Firmen oder Personennamen von einem Strassennamen unterscheiden können. Da dürfte man sogar Beispiele basteln können die nicht einmal ein Mensch zuverlässig separieren kann ohne mehr Hintergrundwissen als nur die Zeichenkette.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Robertsche
User
Beiträge: 7
Registriert: Sonntag 7. Februar 2021, 21:19

@Robertsche: Schon wieder so ein Lookbehind — arbeite Dich mal in die Regex-Grundlagen ein und verwende solche Extrawürste nur wenn die wirklich nötig sind.
wie soll man das denn einfacher machen ?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Einfach eine Gruppe mit Vater|Mutter|Kind|Herr|Frau|Wasauchimmer gefolgt von Leerzeichen gefolgt von einer Catch-all Gruppe, zb.

Ich arbeite seit Jahrzehnten mir regex, look ahead/behind habe ich nich NIE benutzt. Die haben bestimmt ihren Nutzen, aber sowas simples braucht man sie eben nicht.
Robertsche
User
Beiträge: 7
Registriert: Sonntag 7. Februar 2021, 21:19

__deets__ hat geschrieben: Mittwoch 10. Februar 2021, 15:14 Einfach eine Gruppe mit Vater|Mutter|Kind|Herr|Frau|Wasauchimmer gefolgt von Leerzeichen gefolgt von einer Catch-all Gruppe, zb.

Ich arbeite seit Jahrzehnten mir regex, look ahead/behind habe ich nich NIE benutzt. Die haben bestimmt ihren Nutzen, aber sowas simples braucht man sie eben nicht.
Hallo, könntest du mir evtl. ein Beispiel zeigen ?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte keine Beiträge direkt davor vollständig zitieren.

Und ich habe das doch schon hingeschrieben, wie so eine Gruppe aussehen muss. Experimentiere damit rum.
Robertsche
User
Beiträge: 7
Registriert: Sonntag 7. Februar 2021, 21:19

ok ich glaube jetzt habe ich es verstanden

Code: Alles auswählen

(Herr|Frau|Firma)([\D]\D+?)(\n)
Antworten