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

Schwierige Regexprep - Frage

 

bluesaturn
Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 06.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2011, 12:15     Titel: Schwierige Regexprep - Frage
  Antworten mit Zitat      
Hallo alle miteinander.
Ich habe file-Namen in Form von

Code:
filename=39106_001-39106_002-39098_001-39098_009-39100_001-39100_090.dat


1. Zunächst würde ich gerne alle _00 oder _0 rauskicken, so daß ich

39106_1-39106_2-39098_1-39098_9-39100_1-39100_90.dat

bekomme.
Edit: Das habe ich mittlerweile mit

regexprep(filename, '(_00)|(_0)','_')

geschafft. Allerdings weiß ich nicht, ob es eine bessere Lösung gibt.


2. Im folgenden Schritt würde ich gerne die doppelten 5stelligen Nummern rauskicken, so daß ich folgendes erhalte:

39106_1_2-39098_1_9-39100_1_90.dat

Ich habe gestern schon Stunden damit rumgedaddelt, aber ich habe es nicht geschafft.
Ich kann wohl die doppelten Einträge finden mit

Code:

[rega,regb,regc]=regexpi(filename, '(?:\d){2,}','match','start','end')
           
[value,index]=unique(rega,'last');
entries=size(index,2);
index_regb=regb(index)
 index_regc=regc(index)
 


Aber ich konnte die doppelten Einträge dann nicht mehr rauswerfen. Ich dachte an sowas wie:

filename(index_regb:index_regc)=[]

wobei aber mit ndex_regb:index_regc gemeint sein soll:

filename(25:29, 9:13,41:45)=[], also Indexing von mehreren Intervallen gleichzeitig.

Es gilt:
index_regb =

25 9 41
index_regc =
29 13 45

Ich habe auf jeden Fall immer fünfstellige Zahlen und die anderen Zahlen laufen theoretisch von 001-100.

Gibt es Hoffnung für mich? Ich sehe gerade keine Lösung.

Vielen Dank fürs Anschauen.

Viele Grüße
blue
Private Nachricht senden Benutzer-Profile anzeigen


soad
Forum-Century

Forum-Century


Beiträge: 150
Anmeldedatum: 10.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2011, 13:23     Titel: Re: Schwierige Regexprep - Frage
  Antworten mit Zitat      
bluesaturn hat Folgendes geschrieben:

Aber ich konnte die doppelten Einträge dann nicht mehr rauswerfen. Ich dachte an sowas wie:

filename(index_regb:index_regc)=[]


Substrings kannst du z.B. so entfernen
Code:
strrep(filename, filename(index_regb:index_regc), '')
Private Nachricht senden Benutzer-Profile anzeigen
 
bluesaturn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 06.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2011, 13:45     Titel:
  Antworten mit Zitat      
Soad, danke für deine Antwort und den Vorschlag.

Ich habe das mal eben ausprobiert. Leider bekomme ich jetzt:

Code:


filename=039086_1-39086_9-39084_1-39084_9-39088_1-39088_9

K>> strrep(filename, filename(index_regb:index_regc), '')

ans =

39086_1-39086_9-_1-_9-39088_1-39088_9
 



Matlab kickt nun zweimal 39084 raus, statt jeweils einmal die doppelten fünfstelligen Zahlen rauszuhauen. Die Idee war aber am Ende zu haben:

filename=039086_1_9-39084_1_9-39088_1_9

Bitte sei mir nicht böse, das ich sage, dass es noch nicht richtig funktioniert. Oder ich habe es nicht ganz kapiert. Embarassed

Viele Grüße
Blue
Private Nachricht senden Benutzer-Profile anzeigen
 
bluesaturn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 06.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2011, 19:06     Titel:
  Antworten mit Zitat      
Ich habe diese Frage in englischer Version auch bei CSSM Newsgroup gestellt.
Der Link hierzu lautet:

http://mathforum.org/kb/thread.jspa?threadID=2314275
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.11.2011, 23:49     Titel:
  Antworten mit Zitat      
Hallo bluesaturn,

danke für Deine Frage, ich habe heute wieder was neues gelernt:
Matlab kennt keine Referenzen auf verschachtelte Klammern in regulären Ausdrücken Crying or Very sad

Zu Deinem Problem:
sollten immer nur zwei Fünfstelligen Zahlen hintereinander gleich sein, entfernt
folgender regulärer Ausdruck jeweils den 2. Fünferblock:
Code:
>> regexprep(filename,'(\d{5})_(\d+)-\1_','$1_$2_')

Auf Muster in Klammern (hier also fünf Ziffern \d{5}) kann im Suchausdruck mit
\1, \2, ... auf die 1., 2. usw. Klammer verwiesen werden und im Ersetzungstext mit $1, ...
Es wird also nach fünf Ziffern, Unterstrich, 1 oder mehr Ziffern, Minus, den ersten fünf Ziffern, Unterstrich gesucht und dieser Teilstring durch die ersten beiden Ziffernblöcke ersetzt.
Private Nachricht senden Benutzer-Profile anzeigen
 
bluesaturn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 06.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2011, 01:07     Titel:
  Antworten mit Zitat      
Sirius3 hat Folgendes geschrieben:
Hallo bluesaturn,

danke für Deine Frage, ich habe heute wieder was neues gelernt:
Matlab kennt keine Referenzen auf verschachtelte Klammern in regulären Ausdrücken Crying or Very sad

Zu Deinem Problem:
sollten immer nur zwei Fünfstelligen Zahlen hintereinander gleich sein, entfernt
folgender regulärer Ausdruck jeweils den 2. Fünferblock:
Code:
>> regexprep(filename,'(\d{5})_(\d+)-\1_','$1_$2_')

Auf Muster in Klammern (hier also fünf Ziffern \d{5}) kann im Suchausdruck mit
\1, \2, ... auf die 1., 2. usw. Klammer verwiesen werden und im Ersetzungstext mit $1, ...
Es wird also nach fünf Ziffern, Unterstrich, 1 oder mehr Ziffern, Minus, den ersten fünf Ziffern, Unterstrich gesucht und dieser Teilstring durch die ersten beiden Ziffernblöcke ersetzt.



Hallo Sirius,

gerne geschehen für die Frage. Very Happy Fällt die unter " Du bist der Matlab-Profi schlechthin und brauchst neue Herausforderungen?" Razz Smile
Was meinst du bitte mit:
Zitat:

Matlab kennt keine Referenzen auf verschachtelte Klammern in regulären Ausdrücken Crying or Very sad

Das ist für mich zu professionell Smile Wo sind denn verschachtelte Klammern oder meinst du die () in den regulären Ausdrücken?
Warum Crying or Very sad ? Können das andere Sprachen?


Code:
>> regexprep(filename,'(\d{5})_(\d+)-\1_','$1_$2_')

Mal sehen, ob ich das trotz deiner Erklärung verstehe. Sorry.
(\d{5}) sucht die fünfstelligen Nummern.
_ = Unterstrich nach den 5stelligen Zahlen.
\d ist wieder eine Nummer und das Plus bedeutet eine Zahl oder mehrere.
\1 ist wohl der erste Match? Ah, meint dann -\1 die Entfernung des ersten Treffers? Warum ist damit automatisch die fünfstellige Zahl gemeint?
Moment, diese regexp zerteilt den String in Teilstrings (\d{5})_(\d+) und von denen ziehst du immer den ersten Treffer ab? Mir erscheint noch nicht ganz klar woher die Funktion weiß, was $2 ist.
Was meinst du bitte " wird ersetzt durch die ersten beiden Ziffernblöcke"?

Hier noch einmal das Beispiel:
filename =

39086_1-39086_9-39084_1-39084_9-39088_1-39088_9

Du suchst also nach 39086_1-39086_ mit '(\d{5})_(\d+)-\1_', ? Aber wie verschwindet dann die zweite -39086 und die 9 bleibt übrig?

Entschuldigung fürs "laute" Denken und nochmals vielen Dank für die Hilfe. Echt cool.

Again, was für eine krasse Lösung. Da wäre ich ja ewig nicht drauf gekommen. Vielen Dank!

Darf ich mal sagen, daß die Matlab-Hilfe bei Regexp mir irgendwie unübersichtlich erscheint?
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2011, 10:59     Titel:
  Antworten mit Zitat      
Hallo bluesaturn,

Reguläre Ausdrücke sind ein sehr mächtiges Werkzeug und können entsprechend
komplex werden. Es gibt sie auch nicht nur in Matlab sondern für fast jede
Programiersprache, jedoch mit unterschiedlichen Dialekten.

Dein Dateiname
39106_001-39106_002-39098_001-39098_009-39100_001-39100_090.dat
hat ja die Form
#####_###-#####_###- ... .dat
oder als regulärer Ausdruck, der genau dieses Muster beschreibt:
(\d{5}_\d{3}-)*\d{5}_\d{3}\.dat
also abwechselnd 5 bzw. 3 Ziffern.


Geklammerte Asudrücke werden zum Wiederverwenden gespeichert:
Bei (\d{5})_(\d{3}) stehen in \1 die Zeichen in den ersten Klammern
und in \2 die Zeichen in den zweiten Klammern.
Das Suchmuster (\d{5})_(\d{3})-\1 wird also nur dann gefunden, wenn sich
die ersten fünf Ziffern zum Schluß wiederholen.
39106_001-39106 passt genau in dieses Muster
\1 = 39106
\2 = 001
Wird Text mit regexprep ersetzt kann man die gefundenen Klammerausdrücke
auch in den Ersetzungstext mit einbauen, jetzt aber mit $1 bzw. $2
$1_$2 wird damit zu 39106_001. Ein $2/$1 ergäbe 001/39106.
Da aber die gesamte gefundene Zeichenfolge durch den neuen Text ersetzt wird,
verschwindet einfach die zweite 5er-Zahl:
39106_001-39106 -> 39106_001
Private Nachricht senden Benutzer-Profile anzeigen
 
bluesaturn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 06.03.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2011, 17:22     Titel:
  Antworten mit Zitat      
Ich habe eine weitere Frage zu regexp bitte.
Ich habe entweder file names, z.B.

agbehblank_00001r3.fio
agbehblank_00001r15.fio

oder


agbeshortstd_00001.fio

Kann man vielleicht immer die Zahlen vor dem .fio irgendwie rausbekommen?
Das wären in diesem Fall 3, 15 und 1.


Und kann man zuvor _00001r3 oder _00001 wegsplitten, unabhängig wieviele _ man vorher hat? Ich hab es mit _ als Orientierung versucht, aber das klappt nicht. Wenn man z.B. dann ba_buffer_00003r5.fio hat, kam als Ergebnis nur ba raus, weil gleich der erste _ gefunden wurde.
In der Zwischenzeit spiele ich mal weiter rum mit regexp.
Vielen Dank.

Gruß
blue
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.12.2011, 16:15     Titel:
  Antworten mit Zitat      
Hallo bluesaturn,

ja mit regulären Ausdrücken ist das kein Problem:
Code:
zahl=str2double(regexprep(filename,'.*\D(\d+)\.fio','$1'))

bzw. der Ausdruck hinter dem letzten _:
Code:
danach=regexprep(filename,'.*_([^_]+)\.fio','$1'))


Grüße
Sirius
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 - 2025 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.