WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Exkludieren von Variablen beim Speichern mittels regexp

 

JayvH
Forum-Anfänger

Forum-Anfänger


Beiträge: 36
Anmeldedatum: 19.03.11
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 11.09.2017, 11:22     Titel: Exkludieren von Variablen beim Speichern mittels regexp
  Antworten mit Zitat      
Hallo zusammen,

nach ein paar Jahren ist mir in meinen Job wieder MATLAB über den Weg gelaufen. Ich bin etwas eigerostet, habe aber zumindest ein kleines Skript erstellen können, um diverse Datenvektoren zu interpolieren, um letztlich gleich lange Datenvektoren zu erhalten. Jetzt möchte ich mein Ergebnis speichern, und alle Variablen speichern, die zwei Bedingungen NICHT erfüllen.

Sie

  1. beginnen NICHT mit time_
  2. enden NICHT mit _xy, wobei x und y beliebige Ziffern sind.


Ich habe mich schon ein bißchen zu regexp eingelesen, aber ich werde nicht so wirklich schlau daraus, wie man diese Operatoren verwendet. Aus der Dokumentation lese ich, dass das ^ sowohl zum starten einer Expression verwendet wird ($ zum Abschluss), aber auch für Ausschluss-Kriterien.

Aus der MATLAB-Hilfe
Zitat:
[^c1c2c3]
Any character not contained within the brackets. The following characters are treated literally: $ | . * + ? and - when not used to indicate a range.
'[^*rp]ain' matches all four-letter sequences that end in 'ain', except 'rain' and 'pain' and ‘*ain'. For example, it matches 'gain', 'lain', or 'vain'.


Zitat:
Anchors

Anchors in the expression match the beginning or end of the input text or word.

Anchor Matches the... Example
^expr Beginning of the input text. '^M\w*' matches a word starting with M at the beginning of the text.
expr$ End of the input text. '\w*m$' matches words ending with m at the end of the text.


Ich habe mir ein kleines Beispiel gebaut, um erst einmal die time_ Variablen nicht abzuspeichern.
Code:
abc = rand(1,100);
def = rand(1,100);
ghi = rand(1,100);

time_1 = 1:100;
time_2 = 1:2:100;
time_3 = 1:0.5:100;

save('Testsave.mat','-regexp','^time\w*')

speichert aber nur die time_ ab.

Mit
Code:
save('Testsave.mat','-regexp','[^time\w*]')

gibt es aber die Beschwerde, dass es diesen String überhaupt nicht gibt.

Kann mir jemand erklären, wie das korrekt aufzubauen ist?
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 12.09.2017, 16:58     Titel:
  Antworten mit Zitat      
Hallo
Da musst du dem regexp was erlaubt sagen:
so z.B. um time zu exkludieren:
Code:

% kein t, wenn t dann kein, i , wenn ti dann kein m usw
save('Testsave.mat','-regexp','^([^t]|t[^i]|ti[^m]|tim[^e])\w+$')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 13.09.2017, 09:50     Titel:
  Antworten mit Zitat      
Hallo

und so sollten deine 2 Bedingungen erfüllt sein:
Code:

save('Testsave.mat','-regexp','^([^t]|t[^i]|ti[^m]|tim[^e])([a-zA-Z0-9]+|[a-zA-Z0-9_]+_([0-9]{1}|[0-9]{3,}|[a-zA-Z]+))$')
 


PS: es gibt Online-Seiten, wo man on the fly Ausdrücke ausprobieren kann,
wie z.B http://myregexp.com/
Private Nachricht senden Benutzer-Profile anzeigen
 
JayvH
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 36
Anmeldedatum: 19.03.11
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 13.09.2017, 12:43     Titel:
  Antworten mit Zitat      
Hallo ,

vielen Dank erst einmal für die Antwort. Das wirkt ja schon etwas unelegant. Das grundsätzliche Ausschliessen einer Variable, die den Term "time" enthält ist also nicht anders möglich?

Ich habe jetzt noch ein bißchen mehr nachgeforscht und versucht mich mit "negative lookahead/lookbehind" ranzustasten. Wie sieht es mit der Verwendung von "?!" im Code aus?

Ich habe überdies versäumt zu erwähnen, dass ich in meinem tatsächlichen Anwendungsfall sehr wohl eine Variable "time" mit abspeichern möchte, wenn sie keinen Index hat.

Mein Versuch wäre es, alle Variablen die mit Unterstrich und ein oder zwei Zahlen am Ende stehen vom Speichern auszunehmen.

Code:
save Testsave.mat -regexp '\w+(?<!_\d\d?)'


Das hat aber auch noch nicht zum Erfolg geführt.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 13.09.2017, 16:27     Titel:
  Antworten mit Zitat      
Hallo
du muss unter regexp einen Automaten vorstellen, also arbeitet die Funktion Zeichenweise die Terme ab. Also wenn du sagt, dass am Ende keine 2 Ziffern vorkommen dürfen, werden sofort alle ausgeschlossen, auch mit 3 Ziffern und mehr, weil regexp schaut was ist nach dem Unterstrich erlaubt, wenn nicht passt, wird nicht mehr weiter geprüft, also Endzustand ist erreicht.
?! arbeitet auch Zeichenweise, dass ist nur notwendig um UND Verknüpfung zu bauen
(?! [a])b Bedeutet nicht gleich a und gleich b

so kann man bis zu zwei Ziffern nach dem Strich ausschließen.
Code:

% alle Ziffern und Buchstaben sind in beliebiger Folge erlaubt [a-zA-Z0-9]+
% alle Ziffern und Buchstaben und Unterstriche erlaubt, wenn am Ende mehr als 2 Ziffern vorkommen oder nach dem Unterstrich Buchstaben kommen
save('Testsave.mat','-regexp','^([a-zA-Z0-9]+|[a-zA-Z0-9_]+_([0-9]{3,}|[a-zA-Z]+[0-9]*))$')

% kann man etwas kürzer schreiben
save('Testsave.mat','-regexp','^([a-zA-Z0-9]+|\w+_(\d{3,}|[a-zA-Z]+[0-9]*))$')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
JayvH
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 36
Anmeldedatum: 19.03.11
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 15.09.2017, 11:18     Titel:
  Antworten mit Zitat      
Ah verstehe (so langsam). Very Happy

Was ich noch nicht so ganz nachvollziehen kann ist die Vorgehnsweise der regexp, wenn ich bspw.
Code:
oder
Code:
eingebe.

Ich habe das mal eben im empfohlenen myregexp.com eingegeben. Tatsächlich wird ein String namens Time_11 sowie auch ein Time von
Code:
erkannt, da es ja alles Zeichen sind, die in \w definiert sind. Beim 2. Code wird aber nur Time_11 akzeptiert. Ich hatte es jetzt so verstanden, dass der Sucher von regexp soweit vorgeht, bis seine Bedingung nicht mehr erfüllt ist und das ist bei \w+ ja nur am Ende des Strings der Fall Question
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 15.09.2017, 12:33     Titel:
  Antworten mit Zitat      
Hallo
Zitat:
Ich hatte es jetzt so verstanden, dass der Sucher von regexp soweit vorgeht, bis seine Bedingung nicht mehr erfüllt ist und das ist bei \w+ ja nur am Ende des Strings der Fall

\w+ bedeutet beliebige Buchstaben oder Ziffern oder Unterstriche in beliebiger Reihenfolge sind erlaubt. Also wird alles akzeptiert, solange es erlaubte Zeichen hat, wie Time_123 oder Noch_ein_time_variable oder einfach time123

\w+_ wenn du ein Unterstrich dahinten schreibst, dann heißt es, es muss am Ende zumindest ein Unterstrich enthalten sein, also werden jetzt Time_ oder aber auch Time_123_ akzeptiert, nicht aber Time oder Time123, weil kein Unterstrich.( wenn du nicht explizit sagst mit $, dass genau am Ende des Strings Ausdruck stimmen soll, wird auch Time_123 akzeptiert)

Und wenn du weiter um die Zahlen erweiterst, wie
\w+_\d\d?
dann muss ein Unterstrich vorkommen, nachdem mindestens eine Ziffer folgen muss.
Es wird Time_11 akzeptiert oder Time_11_2 oder Time_abc_2, nicht aber Time_abc oder Time ( und hier genauso, wenn du nicht explizit sagst mit $, dass genau am Ende des Strings Ausdruck stimmen soll, wird auch Time_123_abc akzeptiert oder Time_12abc)

Zuletzt bearbeitet von denny am 19.09.2017, 07:49, insgesamt 2-mal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
JayvH
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 36
Anmeldedatum: 19.03.11
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 18.09.2017, 10:44     Titel:
  Antworten mit Zitat      
Super, vielen Dank für die Aufklärung.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.