[Python-de] Treffer ausschließen

Andreas Röhler andreas.roehler at online.de
Mi Mär 20 11:16:30 CET 2013


Am 19.03.2013 19:11, schrieb Karl Pflästerer:
> Am 19.03.13 12:59, schrieb Andreas Röhler:
>> Am 19.03.2013 11:57, schrieb Andreas Röhler:
>>> Hallo allerseits,
>>>
>>> das folgende Stück sollte kein Ergebnis liefern.
>>> D.h. sich verweigern, wenn das Ergebnis der fünften Klammer dem der
>>> zweiten Klammer entspricht.
>>>
>>> import re
>>> a = re.match(r'^(.*?)
>>> +\f([BIR])([^\f]+)\fR([^\f]+)\f([^\2])([^\f]+)\fR *(.*)', 'blah, blab,
>>> \fBblub\fR blah balh \fBh\fR.blub')
>>> print(a.group(5))
>>>
>>> Leider wird stets das "B" ausgegeben.
>>> Wie schreibe ich am besten die Verneinung des Ergebnisses der zweiten
>>> Klammer?
>>>
>>> Sieht so aus, als gäbe einen keinen Negationsoperator :(
>>>
>>> Mit Gruß und Dank,
>>>
>>> Andreas
>>
>>
>> Hier noch einmal ein vereinfachtes Beispiel
>>
>> a = re.match(r'([0-9]+)([db])([^\2]+)', '123dsfaadddd');print(a.groups())
>> ==>
>> ('123', 'd', 'sfaadddd')
>>
>> Die "d" sollten von Klammer 3 nicht gefunden werden(?)
>
>
> Du könntest dein Glück mit Look Around Assertions versuchen:
>
>  >>> a = re.match(r'([0-9]+)([db])(?<!\2)(.+?)(?=\2)', '123dsfaadddd')
>  >>> a.groups()
> ('123', 'd', 'sfaa')
>
>
> Gruß
>    KP
>


Ahh, so geht es, Danke!

Hier noch mal am realen Ausdruck:

# greift die Wiederholung \B..\R,.. \B..\R,..
a = re.match(r'([^\f]+)\f([BI])([^\f]+)\fR([^\f]+)\f\2([^\f]+)\fR(.*)', 'directory, however, \fBsccs\fR applies the subcommand to every \fBs.\fRfile');print(a.groups())

# schließt die Wiederholung \B..\R,.. \B..\R,.. aus
# greift \B..\R,.. \I..\R,..
a = re.match(r'([^\f]+)\f([BI])([^\f]+)\fR([^\f]+)\f(?<!\2)(.)([^\f]+)\fR(.*)', 'directory, however, \fBsccs\fR applies the subcommand to every 
\fIs.\fRfile');print(a.groups())

Andreas


Mehr Informationen über die Mailingliste python-de