Seite 1 von 1

Namen mir Regex auslesen ?

Verfasst: Dienstag 9. Februar 2021, 20:59
von Robertsche
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 !

Re: Namen mir Regex auslesen ?

Verfasst: Dienstag 9. Februar 2021, 22:30
von __blackjack__
@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.

Re: Namen mir Regex auslesen ?

Verfasst: Mittwoch 10. Februar 2021, 15:08
von Robertsche
@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 ?

Re: Namen mir Regex auslesen ?

Verfasst: Mittwoch 10. Februar 2021, 15:14
von __deets__
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.

Re: Namen mir Regex auslesen ?

Verfasst: Mittwoch 10. Februar 2021, 15:15
von Robertsche
__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 ?

Re: Namen mir Regex auslesen ?

Verfasst: Mittwoch 10. Februar 2021, 16:19
von __deets__
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.

Re: Namen mir Regex auslesen ?

Verfasst: Mittwoch 10. Februar 2021, 18:29
von Robertsche
ok ich glaube jetzt habe ich es verstanden

Code: Alles auswählen

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