Teil-String aus String extrahieren (RegEx)

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Teil-String aus String extrahieren (RegEx)

Re: Teil-String aus String extrahieren (RegEx)

by just me » 09 Jul 2020, 05:28

@LuckyJoe: :+1:

Re: Teil-String aus String extrahieren (RegEx)

by LuckyJoe » 09 Jul 2020, 03:06

Hi Bobo,

grundsätzlich hast du natürlich Recht. So habe ich just me's Verkürzung auch gerne übernommen.
bedeutet Datenkonsistenz Vereinheitlichung, AKA Eindeutigkeit.
... auch richtig, aber: für den täglichen Gebrauch und einer schnellen Zurechtfindung mische ich das auch gerne mit aussagekräftigen Bezeichnungen. Eindeutige Artikelnummern sind nun mal schwer zu lesen, wenn nicht die Artikelbezeichnung dabei ist. Für meinen/unseren täglichen Bedarf habe ich einen Kompromiss gefunden, indem die Ordner-/Dateinamen bis zur 19. Stelle einer bestimmten Norm folgen und danach für den Nutzer einfach "leserlicher" werden.

Hintergrund meines Scriptes ist, hiesige Arbeitsabläufe zu minimieren. So soll z.B. der Betreff einer E-Mail dahingehend ausgewertet werden, ob ein solches Kürzel darin vorkommt, um dann direkt die TN-Liste zu öffnen oder in das Verzeichnis zu springen. Das bekomme ich dann mit einem einzigen Button-Klick oder einem Tastenkürzel hin. Kürzer geht es nicht. Die Betreffe von E-Mails ändern sich aber alleine durch Antworten ("RE:", "AW:" usw.), so dass ich das bei meiner RegEx-Auswertung berücksichtigen muss.

In diesem Sinne: Happy Scripting.

Re: Teil-String aus String extrahieren (RegEx)

by BoBo » 09 Jul 2020, 02:07

Ooops, wollte jetzt aber keinen philosophischen Diskurs aufmachen. :P
IMHO stellt jeder zusätzlich(notwendig)e Parameter einer RegEx zum Abfangen von Imponderabilien (musste das Wort jetzt benutzen :lol:) eine Abweichung von "der Regel" dar. Jeder zusätzliche dieser Parameter ist ein Symptom/Hinweis für derartige Abweichungen. Wären alle Dateinamen in sich konsistent/einer spezifizierten Regel folgend, sollte die Anzahl der erforderlichen RegEx-(Abfang)Parameter gegen 0 gehen.
AFAIK, bedeutet Datenkonsistenz Vereinheitlichung, AKA Eindeutigkeit.
just-me's Frage nach Orientierung auf die PLZ zielt für mich genau darauf ab.
Aussagen wie "könnte aber auch dieses oder jenes Zeichen sein" negieren diesen Ansatz.

Meine metaphorische Wortwahl bzgl 'Symptomatik' ist hier eher unglücklich gewählt, da per default damit impliziert wird: gesund oder krank = richtig oder falsch.
Manigfaltige Variationsmöglichkeiten bzgl Dateinamen kann jedoch als Problem oder Option gesehen werden. Ich tendiere zum Ersten, RegEx-Fans wahrscheinlich eher zu Letzterem. Kann Jede/r natürlich machen wie er/sie möchte. Doch wundern wird man sich noch dürfen.

EOT. Happy scripting. BoBo 8-)

Re: Teil-String aus String extrahieren (RegEx)

by LuckyJoe » 08 Jul 2020, 17:02

Hi Bobo,
sprich der nachträglichen (IMHO aufwendigeren) Aufbereitung gearbeitet wird, statt die eigentliche Ursache anzugehen. I know, Datenkonsistenz ist ein herer Anspruch :mrgreen:
... hä??? - Ich weiß jetzt nicht genau, wovon du sprichst. Ich arbeite an keiner aufwendigen Aufbereitung. Was ist denn deiner Meinung nach das "Symptom" und was die eigentliche Ursache, die anzugehen ist? Wo ist die (welche?) Datenkonsistenz denn nicht gewahrt? Ich bin schon ganz gespannt, was du alles aus meiner RegEx-Anfrage herausliest.

Re: Teil-String aus String extrahieren (RegEx)

by BoBo » 08 Jul 2020, 14:55

Da reden wir jedoch von zwei verschiedenen Dingen. Die Art der Dateiablage stelle ich keineswegs in Frage (warum auch?!), wundere mich allerdings warum "am Symptom", sprich der nachträglichen (IMHO aufwendigeren) Aufbereitung gearbeitet wird, statt die eigentliche Ursache anzugehen. I know, Datenkonsistenz ist ein herer Anspruch :mrgreen:

Re: Teil-String aus String extrahieren (RegEx)

by LuckyJoe » 08 Jul 2020, 10:24

Hi Bobo,

die Dateistruktur ist auf meinem Mist gewachsen und ich (und mein Team) kommen damit super zurecht. Ausgehend von einem Hauptverzeichnis gibt es einen Unterordner "Trainings", darunter gibt es die Jahreszahlen seit 2003 als Unterordner. Innerhalb eines Jahres gibt es die Unterordner, die ich in meinem Post als "Kuerzel" bezeichne und die sich immer nach dem gleichen Muster zusammensetzen (Datum des Trainings, Trainingsart, PLZ, Ort). Somit habe ich mit dem Kürzel alle Angaben, die ich brauche, um Ort und Zeit des Trainings zu haben. Im jeweiligen Jahresordner habe ich eine chronologische Reihenfolge aller Trainings und unterhalb eines Trainings alle relevanten Daten ausschließlich zu dem jeweiligen Training (Teilnehmerliste, Buchungen, Notizen usw.). Die Teilnehmerliste (Excel) heißt genauso wie das Kürzel mit der Erweiterung ".xls" bzw. "xlsm". Das hat den Vorteil, dass man beim Arbeiten in der Liste gleich weiß, wo man ist. Auch die spätere Zuordnung von Ausdrucken mit dem Dateinamen wird damit vereinfacht.

Letztlich hat sicher jeder seine eigene Philosophie, was Dateistruktur, Übersicht und schnelles Wiederfinden anbelangt. Dieses System hat sich – wie gesagt - bei mir seit 16 Jahren bewährt.

Re: Teil-String aus String extrahieren (RegEx)

by BoBo » 08 Jul 2020, 10:06

Das Kürzel kann dabei irgendwo innerhalb der Markierung stehen (Anfang, Mitte, Ende). Es kann durch "[]" eingerahmt sein, muss es aber nicht. Es wird beendet mit einem " - " oder wie erwähnt mit "]" oder dadurch, dass es am Ende des Strings steht.
Well, nach Beantwortung von just-me's Frage noch eine von mir: warum lässt du dir 16 Jahre lang Daten mit derartigen Varianzen aufs Auge drücken? :o :think: :silent:

Wenn es redundante Vorgänge sind, sollte sich doch problemlos eine Dateinamenspezifikation etablieren* lassen ( :arrow: weisungsbefugter Teamleader)?
Nach dreimal freundlichem Retournieren hat das selbst bei unseren Kunden immer geklappt, und nach 3 Wochen wusste keiner mehr das es je anders war.
Stichworte wie 'Performancesteigerung/Vereinfachung/Automatisierung/...' sind auch da durchaus akzeptable Argumentationshilfen. Anyway ... 8-)

* wenn das mal kein Anlaß ist ein AHK-gadget zu spenden, welches spezifikationskonforme Dateinamen ausspuckt ;)

Re: Teil-String aus String extrahieren (RegEx)

by LuckyJoe » 08 Jul 2020, 10:02

... ah, jetzt weiß ich, worauf du hinaus willst: damit mache ich die RegEx-Suche nicht ganz so kompliziert - genial! Baue ich noch mit ein. Danke!

Re: Teil-String aus String extrahieren (RegEx)

by just me » 08 Jul 2020, 07:47

Die Frage lautet ja: Was machst Du mit dem extrahierten Text. Wenn es darum geht, einen Ordner oder eine Datei mit gleichem Namensschema zu finden, sollte ja ein

Code: Select all

SuchOrdner := "..."
Loop, Files, %Suchordner%\%NameAusRegEx%*
{
	FilePath := A_LoopFilePath
	Break
}
ausreichen.

Re: Teil-String aus String extrahieren (RegEx)

by LuckyJoe » 08 Jul 2020, 07:44

... hat sich seit 16 Jahren (fehlerlos) bewährt ;-)

Re: Teil-String aus String extrahieren (RegEx)

by haichen » 08 Jul 2020, 07:18

Ich weiß nicht wie diese Daten entstehen ob durch Software, Webseite oder Handarbeit (eintippen). Bei letzterem ist es vermutlich sowieso sinnvoll PLZ und Ortsname zu haben um hier Falscheingaben zu erkennen. Ein Zahlendreher ist schnell produziert. Ein Fehler in Ortsname UND PLZ läßt sich händisch leicht korrigieren. Aber ich hatte mir auch erst gedacht, das die PLZ ausreicht.

Re: Teil-String aus String extrahieren (RegEx)

by LuckyJoe » 08 Jul 2020, 06:37

Hallo just me,

du hast vollkommen Recht, die Angabe des Ortes ist eigentlich überflüssig, da die PLZ eindeutig ist. Ich (und mein Team) haben durch die Ortsangabe aber einen besseren Überblick, da es mühseliger ist, Nummern gedanklich zu "übersetzen", als den Ortsnamen im Pfad-/Dateinamen mitzuführen. Vor allem bei einer schnellen Suche nach "Hintertupfingen" ist das einfacher, als zunächst die PLZ dazu herauszusuchen.
Das Script dient dazu, vor allen beim E-Mail-Verkehr durch Markieren des Betreffs (Doppelklick ist schneller, als das gewünschte Kürzel dort mit der Maus fummelig zu markieren) das Kürzel herauszufiltern und dann z.B. die Teilnehmerliste zu laden oder in den Ordner zu springen.

Danke trotzdem für den Hinweis - ich bin für Kürzungen beim Scripten immer dankbar.

Re: Teil-String aus String extrahieren (RegEx)

by just me » 08 Jul 2020, 06:24

Hallo Lucky Joe,

der Zug ist zwar schon abgefahren, aber mich irritiert trotzdem etwas.
Nach diesem Schema werden dann auch dazugehörige Ordner und Dateinamen verwendet, z.B.: "20-05-15 (KT) 50996 Köln".
Da stellt mich mir die Frage, wozu Du den Ortsnamen überhaupt brauchst. Kan es denn für 20-05-15 (KT) 50996 überhaupt mehrere Ordner/Dateien mit unterschiedlichen Ortsnamen geben?

Re: Teil-String aus String extrahieren (RegEx)

by LuckyJoe » 08 Jul 2020, 02:48

Hallo haichen,
:bravo:
das ist SUPER! Läuft mit allen derzeit durchgespielten Beispielen. Auch deine Erklärung mit dem "U" ist verständlich - Danke für deine Mühen.

Re: Teil-String aus String extrahieren (RegEx)

by haichen » 08 Jul 2020, 02:25

Code: Select all

MyAuswahl1 := " hhh 20-05-15 (KT) 63628 Bad Soden-Salmünster (KT) - Anmeldung: Hans.Pumpelmuser at abcdef.de"
MyAuswahl2 := "RE: meine Anmeldung zu [20-05-15 (KT) 63628 Bad Soden-Salmünster (KT)    ]   "
MyAuswahl3 := "          Re: 20-08-21 (TT) 63628 Bad Soden-Salmünster      "
text:=""

r:="U)\[?([1-4][0-9]-[0-1][0-9]-[0-3][0-9].+[0-9]{5}\s+\w.*)(\s-|\]|$)"

loop,3 
{
RegExMatch(MyAuswahl%a_index%, r, Kuerzel)
text.= "MyAuswahl" a_index "`n|" Kuerzel1 "|`n`n"
}
MsgBox, % text

/* Resultat
MyAuswahl1
|20-05-15 (KT) 63628 Bad Soden-Salmünster (KT)|

MyAuswahl2
|20-05-15 (KT) 63628 Bad Soden-Salmünster (KT)    |

MyAuswahl3
|20-08-21 (TT) 63628 Bad Soden-Salmünster      |
*/
Ich wollte den regulären Ausdruck eigentlich anders formulieren. So funktioniert es. Ohne das U) "ungreedy" wäre das Musterende immer das Zeilenende ($). Mit U bricht ist das Muster mit dem ersten Fund von "Leerzeichen Bindestrich \s-" oder "schließende eckige Klammer \]" oder "Zeilenende $" ab. Ich hoff die Erklärung ist soweit richtig. :roll:

Re: Teil-String aus String extrahieren (RegEx)

by haichen » 07 Jul 2020, 08:37

Bekomme ich nicht hin. Hab einen Klemmer. Mal drüber schlafen. Sorry.

Re: Teil-String aus String extrahieren (RegEx)

by haichen » 07 Jul 2020, 08:35

Da fehlte noch das Zeilenende $ als Begrenzer

Code: Select all

MyAuswahl := "Re: 20-08-21 (TT) 63628 Bad Soden-Salmünster"
RegExMatch(MyAuswahl, "\[?([1-4][0-9]-[0-1][0-9]-[0-3][0-9].+ [0-9]{5}\s+\w.*)(\s-|\]|$)", Kuerzel)
MsgBox, % Kuerzel1

Re: Teil-String aus String extrahieren (RegEx)

by haichen » 07 Jul 2020, 08:32

Ich versuchs mal das aufzudröseln:

\[? Am Anfang steht eine eckige Klammer oder auch nicht

([1-4][0-9]-[0-1][0-9]-[0-3][0-9].+ [0-9]{5}\s+\w.*)
Was in den runden Klammern gefunden wird, ist der Subpattern der in Kuerzel1 (nicht die 1 vergessen) gespeichert wird.
Es wird ein Datum gesucht, gefolgt von beliebigen Zeichen (.+), der 5stelligen Posleitzahl ([0-9]{5}), mindestens einem Leerzeichen (\s+) und einem Wort (\w) und weiteren Zeichen (.*)

(\s-|\])
fertig ist das Muster wenn ein Leerzeichen und Bindestrich auftauchen oder die schließende eckige Klammer.

Re: Teil-String aus String extrahieren (RegEx)

by LuckyJoe » 07 Jul 2020, 08:21

Danke für deine Unterstützung und auch die Erklärung.
MsgBox, % Kuerzel1
... hatte gedacht, du hast dich vertippt :lol:

Ok, wieder etwas schlauer, aber es ist immer noch nicht das, was ich suche:
Zunächst sollte die Klammeraufzählung "\(KT|KA|TT|JT|FT|ET|DT\)" drin bleiben (ist abschließend).

Mein "Kuerzel" soll auch dann erkannt werden, wenn hinter der Stadt keine Zeichen mehr kommen, also wie bei
MyAuswahl := "Re: 20-08-21 (TT) 63628 Bad Soden-Salmünster"
Gewünschtes Ergebnis: "20-08-21 (TT) 63628 Bad Soden-Salmünster"
Das findet er bei den Ausdrücken von dir und mir noch nicht. Hast du noch eine Idee?

Re: Teil-String aus String extrahieren (RegEx)

by haichen » 07 Jul 2020, 08:10

Der Trick ist, die Eingrenzung gut zu setzen. Also ich habe jetzt Datum und " -" (Leerzeichen und Bindestrich) oder "[" und "]" genommen.
Dazu wird mit den ersten beiden runden Klammern "\[?([1-4][0-9]-[0-1][0-9]-[0-3][0-9].+ [0-9]{5}\s+\w.*)(\s-|\])" der Subpattern angezeigt (Kuerzel1). Also ohne die eckigen Klammern.

Top