1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Automator RegEx

Dieses Thema im Forum "Magazin" wurde erstellt von Zettt, 24.08.07.

  1. Zettt

    Zettt Doppelter Melonenapfel

    Dabei seit:
    16.10.05
    Beiträge:
    3.374
    Wer nicht weiss, was reguläre Ausdrücke sind, der kann sich am besten bei Wikipedia.

    Kurz:
    Reguläre Ausdrücke (= Regular Expressions = RegEx) sind eine Möglichkeit intelligente Textstücke, die gewissen Kriterien entsprechen, aus einem langen Text heraus zu filtern.

    Beispiel: (Auszug aus oben verlinkter Wikipedia Seite)
    Code:
    Die folgenden Syntaxbeschreibungen beziehen sich auf die Syntax der gängigen Regex-Implementierungen mit Erweiterungen, sie entsprechen also nur teilweise der obigen Definition aus der theoretischen Informatik.</p>
    <p>Eine häufige Anwendung regulärer Ausdrücke besteht darin, spezielle Zeichenketten in einer Menge von Zeichenketten zu matchen. Die im Folgenden angegebene Beschreibung ist eine (oft benutzte) Konvention, um Konzepte wie <i>Zeichenklasse</i>, <i>Quantifizierung</i>, <i>Verknüpfung</i> und <i>Zusammenfassen</i> konkret zu realisieren. Hierbei wird ein regulärer Ausdruck aus den Zeichen des zugrunde liegenden Alphabets in Kombination mit sogenannten <i>Metazeichen</i> (* [ ] ( ) { } | *? + * ^ $ \ . *) gebildet. Alle übrigen Zeichen des Alphabets stehen für sich selbst.</p>
    Wir möchten nun diesen ganzen Text gerne etwas schöner haben. Zum Beispiel wäre es schön, wenn alle <i> und </i> weg wären. Mit Hilfe eines RegEx sähe das so aus:
    Code:
    <.i>
    Kurz übersetzt würde das heissen: "Suche alle '<' gefolgt von irgendeinem Zeichen ('.') und nach dem ein 'i>' angehängt ist." So würde man schonmal alle </i> finden und durch '' (nichts...also kein Zeichen) mittels "Suchen und ersetzen" austauschen können. Noch nicht ganz perfekt. Ein weiteres Spezialzeichen verrät dem regulären Sucher, dass er auch nach allen '<' auf das irgendein Zeichen folgt ('?') und auf das wieder die Zeichen 'i>' folgen"
    Code:
    <.?i>
    Ergebnis:
    Code:
    Die folgenden Syntaxbeschreibungen beziehen sich auf die Syntax der gängigen Regex-Implementierungen mit Erweiterungen, sie entsprechen also nur teilweise der obigen Definition aus der theoretischen Informatik.</p>
    <p>Eine häufige Anwendung regulärer Ausdrücke besteht darin, spezielle Zeichenketten in einer Menge von Zeichenketten auszutauschen. Die im Folgenden angegebene Beschreibung ist eine (oft benutzte) Konvention, um Konzepte wie Zeichenklasse, Quantifizierung, Verknüpfung und Zusammenfassung konkret zu realisieren. Hierbei wird ein regulärer Ausdruck aus den Zeichen des zugrunde liegenden Alphabets in Kombination mit sogenannten Metazeichen (* [ ] ( ) { } | *? + * ^ $ \ . *) gebildet. Alle übrigen Zeichen des Alphabets stehen für sich selbst.</p>
    Nun noch die ganzen </p> (neuer Paragraph) durch eine neue Zeile ersetzen und alle <p> einfach heraus nehmen.

    Ergebnis:
    Code:
    Die folgenden Syntaxbeschreibungen beziehen sich auf die Syntax der gängigen RegEx-Implementierungen mit Erweiterungen. Sie entsprechen also nur teilweise der obigen Definition aus der theoretischen Informatik.
    
    Naja zugegeben...den letzten Zeilenumbruch könnt ihr nicht mehr erkennen, aber wenigstens sind die Zeichen weg.
    
    Der Automator hat diese tolle Sache jetzt mit der oben erwähnten "RegEx File Renamer" Aktion erlernt. Einfach in [I]~/Library/Automator/[/I] kopieren und schon kann man die Aktion in Automator verwenden, als Finder PlugIn speichern und fortan seinen Spass haben...und den wünsch' ich euch :-D
    
    PS: Der Workflow hängt wieder an. Ich habe ihn "Rename Files..." genannt. So wie es "normale" Programme auch machen, habe ich drei Punkte angehängt, denn es folgen nach ausführen des Workflows einige Abfragen an den Benutzer ;-)
     

    Anhänge:

    #1 Zettt, 24.08.07
    Zuletzt von einem Moderator bearbeitet: 05.09.07
  2. Hobbes_

    Hobbes_ Gast

    Lieber Zettt,

    Ein paar mehr Infos wären für uns Nicht-Geeks schon hilfreich:

    - Mehr Infos zu RegEx selbst wären hilfreich
    - Wie hast Du das genau gemacht mit dem Einbau im Automator.
    - Das Beispiel verdeutlicht nicht sehr viel bzgl der Funktionalität von RegEx.

    Kurz: Ein etwas ausführlicherer Text wäre hilfreich fürs Verständnins. Vielen Dank!
     
  3. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Und außerdem schreibt man niemals, nie, nicht unter keinen Umständen, keinesfalls "<.?i>" wenn mann <i> und </i> ersetzen will, sondern man schreibt: "</?i>" (falls maskiert werden muß natürlich "<\/?i>").

    Außerdem kann man sich bei tags ja nie so sicher sein, ob nicht vielleicht doch mal jemand ein Attribut dazugeschrieben hat. Hier setzte ich auf die Perl Notation, die wohl inzwischen die gebräuchlichste ist. Dort schreibt man dann, um eben Attribute auch och auszuschließen: "</?i\b[^>]*>" (Erklärung folgt bei Bedarf).

    P.S.: Nur falls sich jemand fragt, warum man nicht "<.?i>" verwenden darf, soll sich dieser jemand mal überlegen, was aus Listen würde, nähme man es...
     
    1 Person gefällt das.
  4. space

    space Neuer Berner Rosenapfel

    Dabei seit:
    02.12.05
    Beiträge:
    1.950
    Einbau: Wie von Zett beschrieben, dann taucht die Action in der Finder-Bibliothek des Automators auf.
    Funktionalität: Geht halt über Finder Objekte umbenennen hinaus, da es Files effektiver umbenennen kann.

    Ich habe in Zetts Beitrag keinen Screenshot gefunden (aber eventuell bin ich durch das gesprengte Layout abgelenkt), doch hier der des Entwicklers. Er sollte Klarheit schaffen:

    [​IMG]

    Gruss
     
  5. Hobbes_

    Hobbes_ Gast

    Vielen Dank für Deine Ergänzungen.

    Vielleicht bin ich blind auf den Ohren - doch ich habe im originalen Beitrag nicht nur keine Screenshots gesehen. ich weiss nicht, was Du meinst mit "Einbau: Wie von Zettt beschrieben"? Der Einbau in den Automator wird eben nicht beschrieben... Desweiteren ist mir die beschriebene Implementation wirklich nicht klar geworden.

    Kurz: Der bezahlte Redaktions-Artikel verdient Nachbesserung. Wie wäre es, wenn jeder nur über die Dinge schreibt, von denen er/sie wirklich etwas versteht? Es gibt deutlich grössere regex-Experten hier im Forum (siehe zb. Skeeve). Diese könnte man ja auch anfragen, gegen Bezahlung etwas richtiges zu schreiben...

    Gruss
    psc
     
    #5 Hobbes_, 02.09.07
    Zuletzt von einem Moderator bearbeitet: 02.09.07
  6. reimic

    reimic Stina Lohmann

    Dabei seit:
    31.08.06
    Beiträge:
    1.036
    Die ganz normale Suchen & Ersetzen funktion reicht in so einem Fall aber auch, finde ich. Wenn man zb. alle <p> weg haben will, sucht man nach "<p>" und klickt auf "Alle ersetzen" und weg sind sie...
     
  7. space

    space Neuer Berner Rosenapfel

    Dabei seit:
    02.12.05
    Beiträge:
    1.950
    In dem dmg liegt ein Ordner RegexFileRenamer.action.
    Diesen in ~/Library/Automator kopieren. Fertig

    Der Hinweis von Skeeve macht deutlich, dass RegEx ohne Vorkenntnisse nicht so einfach zu nutzen ist. Weshalb ich das (leider) auch eher selten nutze.
    Skeeve und der Automator. Das wird wohl nichts … obwohl gegen Bezahlung …

    Auf jeden Fall sei hiermit geschrieben, dass deine einführenden Erklärungen, die Du Skeeve (leider selten) hier postest, von mir immer aufgesaugt werden. Die haben mir schon des Öfteren gute Starthilfe geleistet.


    Ja, Zettts Beispiel macht nicht die eigentliche "Stärke" von RegEx deutlich. Siehe Screenshot weiter oben.
     
  8. Jenso

    Jenso Gast

    Donnerschock,
    da habe ich mir schnell noch ein paar Beiträge auf ihre Sprachblüten hin angesehen und dachte, das Schlimmste sei überstanden, da fällt mein entgeisterter Blick auf eine weitere staunenswerte Kreation:
    Der Aufmacher ist schon toll: man könne sich am besten bei Wikipedia. Ja, was denn? Fehlt da nicht ein Prädikat? oder überhaupt ein Sinn?

    Klarer wird es nicht: „sind eine Möglichkeit intelligent Textstücke die gewissen Kriterien entsprechen aus einem lange Text heraus zu filtern."
    Diese lange Text hat offenkundig seinem Schöpfer den Überblick vernebelt und alle Interpunktion, aber auch alle intellligente Textstücke (sic!) beseitigt…

    „Wir möchte nun diesen ganzen Text gerne etwas schöner haben.“ - Inhaltlich kann ich dem nur zustimmen, jedenfalls seiner gewollten Aussage, allerdings fände ich doch wieder etwas zu kritteln, wenn ich nicht erschöpft wäre: hier ist - und es geht noch lange weiter! - sprachlich Hopfen und Malz verloren.

    Entweder man veröffentlicht Texte in einem Magazin (das soll es ja werden!) erst, nachdem man sie kritisch durchgesehen hat, oder man bittet einen Gehilfen (da man selbst dies durchaus nicht leisten könnte) dieses für einen zu tun. Oder einen Lektor. Oder schweige gnädig und räumte das Feld.

    Ich schließe grundsätzlich aus der Gestalt eines Textes auch auf den Urheber - bei diesem Beitrag eine größere Kompetenz, zumindest eine, die seinen Schöpfer zum „Redakteur“ befähigte, anzunehmen, fällt mir arg schwer.

    Dem Untergang (des Magazins) entgegen sehend
    Jens
     
  9. space

    space Neuer Berner Rosenapfel

    Dabei seit:
    02.12.05
    Beiträge:
    1.950
  10. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Wie hieß es so schön in einem Zeitungsbericht über den Redaktionsalltag (ich meine, ihn beim Zwiebelfischchen gelesen zu haben):
    Vielleicht hat sich ja jemand dadurch inspirieren lassen? ;)

    Da müßten wir mit meinem Scheff reden, da ich das dann nur während der Arbeitszeit erledigen würde. Meine (spärliche) Freizeit verbringe ich lieber mit Frau und Kind.

    Danke fürs Lob. Was die "Seltenheit" angeht: Einfach öfters mal Fragen stellen. Ich schreibe lieber konkret zu einem Problem was, als irgendwelche allgemeinen Einführungen zu verfassen.
     
  11. Moriarty

    Moriarty Pommerscher Krummstiel

    Dabei seit:
    17.05.04
    Beiträge:
    3.032
    ...Und nochmal für Nicht-Geeks: Wofür braucht man das??? (Und das ist nicht provokant gemeint, sondern wirklich interessiert...:))

    Gruß
    Dennis
     
  12. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    Für alles Möglich. Das schöne an REs ist, daß man Muster für Zeichenketten angeben kann um sie zu finden. Ebenso kann man angeben, durch was sie ersetzt werden sollen.

    Beispiel: Wenn Du einen langen Text hast, in dem immer wieder Daten in amerikanischer Notation vorkommen, Du möchtest sie aber gerne in Deutscher dort stehen haben, dann kannst Du einen Editor bemühen, der Suchen und Ersetzen mit regulären Ausdrücken beherrscht. Ich empfehle da immer wieder gerne jEdit. Andere können das sicherlich auch.

    Um nun die Daten zu finden, muß man wissen, wie sie aussehen.

    Wir gehen einfach mal davon aus, daß sie rein numerisch aufgebaut sind, also
    1. Eine Zahl von 1-12
    2. ein /
    3. Eine Zahl von 1-31
    4. ein /
    5. eine Jahreszahl
    Der Einfachheit halber nehmen wir Jahreszahlen als 4stellig an.

    Dann könnte so ein regulärer Ausdruck so aussehen:
    \d\d/\d\d/\d\d\d\d
    \d steht für "Digit", also "Ziffer". Je nachdem, wie genau wir sein wollen, reicht das hier schon.

    Obwohl das auch Zeichenketten trifft wie die Traummaße eines Mannes:
    80/40/10000000 (80 Jahre alt, 40° Fieber, 10 Millionen auf dem Konto)

    Also etwas genauer:
    \b\d\d/\d\d/\d\d\d\d\b
    \b steht hier für "boundary" = Grenze. Eine Grenze ist immer dort erreicht, wo ein Wort (oder eine Zahl) auf etwas anderes (Leerzeichen z.B.) trifft.

    Leider würde das aber bisher nur 2-stellig notierte Monate und Tage finden. Das ändern wir rasch:
    \b\d?\d/\d?\d/\d\d\d\d\b
    Nun ist die erste Ziffer im Monat und Tag optional

    Wenn wir jetzt noch genauer sein wollen, können wir die erste Ziffer einschränken:
    \b[01]?\d/[0-3]?\d/[12]\d\d\d\b
    Sieht doch schon gut aus. Es sind damit zwar auch Daten wie:
    19/39/2999 möglich, aber das werde ich nun nicht weiterführen.

    Nun wollen wir aber auch noch die Daten durch die gewohnte, deutsche Schreibweise ersetzen, d.h. Tag.Monat.Jahr.

    Dazu muß man wissen, daß man Teile eines RE klammern kann und sich im Ersetzungsmuster wieder auf diese Teile beziehen kann. Das setzt voraus, daß man zählen kann ;) Denn jede öffnende Klammer wird gezählt:
    Wir suchen \b([01]?\d)/([0-3]?\d)/([12]\d\d\d)\b
    Wir sehen: Die erste Klammer steht um die Monatszahl, die zweite um die Tageszahl und die dritte um das Jahr.
    Wir ersetzen $2.$1.$3
    Das bedeutet: Nimm das, was mit der 2ten Klammer gefunden wurde ($2) setze einen . Dahinter das, was mit der ersten Klammer gefunden wurde, wieder einen , und abschließend die dritte Klammer.

    So... Das sollte erstmal reichen. Bei Fragen: Immer her damit.
     
    #12 Skeeve, 03.09.07
    Zuletzt bearbeitet: 03.09.07
    Bonobo, space, CRiMe und 2 anderen gefällt das.
  13. space

    space Neuer Berner Rosenapfel

    Dabei seit:
    02.12.05
    Beiträge:
    1.950
    Klasse!
    Gut verständlich und leicht nachvollziehbar.

    Vielen Dank an dich Skeeve!
    Freu! :)

    Gruss
     
  14. mina

    mina Roter Delicious

    Dabei seit:
    12.07.07
    Beiträge:
    93
    Da möchte ich mich gleich mit einem 'Danke' an Skeeve anschließen!
    Durch deine sehr verständliche Erklärung haben sich bei mir einige Fragezeichen im Kopf aufgelöst!

    Vielen Dank an dich!
     
  15. MetalSnake

    MetalSnake Gala

    Dabei seit:
    16.03.07
    Beiträge:
    53
    Die Erklärung von Skeeve finde ich auch gelungen. Jetzt verstehe ich die auch endlich. :)
    Was ich mich allerdings noch frage ist: Was ist der Unterschied zwischen . und ? im regex? In dem ersten Beitrag wird bei beiden Zeichen gesagt es steht für irgendein Zeichen, weshalb ich die kette <.?i> schon nicht verstehe. Wären dann ja zwei Zeichen. Wobei Skeeve aber meinte das ? steht für optionale Zeichen also wird mit <.?i> sowohl <i> als auch </i> gefunden?
    Das wird aus dem ersten Beitrag eher unklar, der verwirrt irgendwie nur (auch durch die vielen Tipp- und Grammatikfehler).
     
  16. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    . steht für ein beliebiges Zeichen (außer Zeilenende).
    ? steht dafür, daß der Ausdruck links davon optional ist. Ein Ausdruck ist entweder ein Zeichen oder etwas geklammertes.
    ABB?A steht also für ABA und ABBA da das zweite B, also der Ausdruck "B" optional ist
    A(BB)?A für AA und ABBA da der Ausdruck "(BB)" opional ist

    ? läßt sich auch als {0,1} schreiben
    Dann gibt es noch, analog zu ?:
    * für 0 bis beliebig häufige Wiederhloung {0,}
    + für 1 bis beliebig häufige Wiederhloung {1,}

    Und wenn man spezielles braucht:
    {n} für genau n-faches Auftreten
    {n,} für mindestens n-faches Auftreten
    {n,m} für n- bis m-faches Auftreten

    Bei Bedarf mehr von mir... Einfach hier posten und sicherheitshalber eine PN hinterher.
     
  17. Bier

    Bier Pomme au Mors

    Dabei seit:
    24.08.07
    Beiträge:
    867
    Das ist schon ganz sinnig, allerdings haben sich Skeeve und space mehr Arbeit mit der Sache gemacht als Zettt. Ich mein: mal ernsthaft. Das ist hingerotzt und der Sache unwürdig. Dann lieber gar nichts schreiben.

    Das hat auch nichts mit geek zu tun, wenn man Dinge falsch, unzureichend, oder gar nicht beschreibt. Sorry Mann, aber das echt mal nen redaktioneller Griff ins Klo.
     
    1 Person gefällt das.
  18. janfili

    janfili Gast

    regex präfix entfernen

    Folgendes:
    Ich versuche ein von einer ganzen Reihe Datein jeweils die ersten 5 Zeichen zu entfernen, bei allen Elementen folgt darauf mindestens ein Zeichen. Wie setzte ich das um?

    Zu Regex selber; habe versucht die Situation im Screenshot nachzustellen, aber nichteinmal das ist funktionfähig. Wie gesagt benötge, Hilfe.
    Wäre für hilfe echt dankbar.
     
  19. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    die ersten 5 Zeichen findet man mit "^.{5}". Je nach verfügbarem RE Interpreter kann man auch noch sicherstellen, daß es ein sechstes Zeichen gibt:
    entweder "^.{5}(.)", dann muß man durch "$1" ersetzen
    oder "^.{5}(?=.)", dann reicht es wie gehabt durch "" zu ersetzen.
     
  20. janfili

    janfili Gast

    Danke für die schnelle Antwort Skeeve leider funktioniert es nicht.
    Ich bekomme bei jeder Aktion eine Fehlermeldung zurück.
    Die selbe Fehlermeldung erhalte ich auch dann, wenn ich die Situation im Screenshot 1 zu 1 nachstelle.
    Ich verwende Version 1.0 des "Regex file Renamer" in einem deutschsprachigem Automator (vielleicht funktioniert das ja nicht).
    Gibt es die Möglichkeit das ich beim installieren dieser aktion einen Fehler gemacht habe?
     

Diese Seite empfehlen