[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: kleines RegEx Problem



On 24.05.06 18:56:45, Frank Küster wrote:
> Andreas Pakulat <apaku@gmx.de> wrote:
> 
> > '^([^_]+)_([^_]+)(_.+)*(\.orig\.tar\.gz|\.tar\.gz|\.diff\.gz|\.dsc|\.deb|\.udeb|\.package|\.source)$'
> >
> > Das Problem dabei: Bei foobar_version.orig.tar.gz erhalte ich fuer
> >
> > \1 = foobar
> > \2 = version.orig
> > \3 = tar.gz
> 
> Ich sehe da vier subexpressions,

Jupp. Allerdings ist \3 im Falle von foobar_0.2.4.orig.tar.gz leer.

> aber bei der dritten fehlen mir
> brackets? 

?? brackets? Wieso brackets? Die 3. matcht auf eine eventuell vorhandene
Architektur.

> > Das Problem: Ich kann keine weiteren Einschraenkungen in Gruppe 2
> > machen, da sowohl Buchstaben als auch . dort erlaubt sind. Ich muesste
> > also irgendwie ausdruecken, dass orig.tar.gz "Vorrang" vor tar.gz hat.
> > Nur da verlassen sie mich halt, so ein Regex-Guru bin ich leider nicht
> > :-(
> >
> > Jemand nen Tipp wie ich das mit einer regex erschlagen kann (mit
> > mehreren ist es kein Problem, das stoert dann aber im Progamm etwas)?
> 
> Du verwendest ein Programm, das sich entsprechend regex(7) verhält, ja?

Ich verwende Python's re-Modul und bin da ehrlich gesagt ueberfragt.

> In Perl kann man nämlich das Matching non-greedy machen - das würde
> helfen.

In Perl geht das sowieso viel einfacher:

if file =~ m/...orig.tar.gz/:
	orig = \1
elif file =~ m/...tar.gz/:
	foobar = \1

In Python brauch ich fuer die Expandierung der subexpressions leider das
match-Objekt...

>  Ansonsten habe ich keine Idee, außer dass man vielleicht die
> OR's (also '|') anders schachteln könnte, so à la

Ich hab jetzt erstmal 3 match-Objekte, eines fuer orig.tar.gz, eines
fuer tar.gz und eines fuer den Rest. Das orig.tar.gz wird als 1.
abgetestet und somit funktioniert das ganze. Nur schoen ist das eben
nicht.

Andreas

-- 
You will be awarded the Nobel Peace Prize... posthumously.



Reply to: