[Python-de] Re: Regular Expression - negative lookbehind

Thorsten Kampe thorsten at thorstenkampe.de
Fre Mai 28 13:55:43 CEST 2004


* Staack, Thomas 3877 RD-IS-E23 (2004-05-28 13:17 +0100)

> ich bin neu hier und hoffe, dass ich zum Einen mit dieser Anfrage
> keinen Fehler gemacht habe [...]

Wie wär's denn 'mal mit einem /Zeilenumbruch/ bei ungefähr siebzig
Zeichen? Es ist eine Zumutung, deinen Artikel lesen zu müssen.
  
> Ich möchte in einer Regular Expression das "negative lookbehind"
> einsetzen - habe es aber auch nach stundenlangem Versuchen nicht
> hinbekommen.
>  
> Hier der Auszug aus der Python Help:
>  
> (?<!...) 
> 
> Matches if the current position in the string is not preceded by a
> match for .... This is called a negative lookbehind assertion.
> Similar to positive lookbehind assertions, the contained pattern
> must only match strings of some fixed length. Patterns which start
> with negative lookbehind assertions may match at the beginning of
> the string being searched.
>  
> Und hier mein Testprogramm:
>  
> import re
> line_s = ['#begin-a AND End-a 2', '!begin-b and End-b 3']
> regexp = r'begin(!AND)'
> c_regex = re.compile(regexp)
> for x in line_s:
>  print '-' * 20, x
>  if c_regex.search(x) != None:

   if c_regex.search(x):

>   print 'found it...'
>  else: 
>   print "didn't find it..."
> 
> Ich erwarte, dass einmal der if- und einmal der else-Zweig
> durchlaufen wird - die RegularExpression sollte ein 'begin' mit
> einem grossgeschriebenen 'AND' nicht als Treffer werten...

Lesen solltest du schon können. Für "negative lookbehind" steht in der
Hilfe "?<!" und nicht "!" wie in deinem Code. Außerdem steht in dem
Beispiel zu "positive lookbehind" ganz klar, daß der "lookbehind"
/vor/ dem Match kommt!

Außerdem willst du ja nicht "zurück" sehen sondern vorwärts ("ahead"),
da das "AND" hinter dem "begin" kommt (vom Stringanfang aus gesehen).
Du kannst aber nicht einfach beliebige Zeichen zwischen dem "begin"
und dem "AND" einfach ignorieren.

Richtig ist also: "regexp = r'begin(?!.*AND)".

Allgemein: rücke bitte mit vier Leerzeichen ein (statt einem). 

Außerdem hat dein Problem nichts mit Python sondern mit Regulären
Ausdrücken zu tun; lies...

* Regular Expressions
  http://www.grymoire.com/Unix/Regular.html

* Regular Expression HOWTO
  http://www.amk.ca/python/howto/regex/regex.html
  http://www.amk.ca/files/howto/regex.pdf

* Tutorial: Using regular expressions
  https://www6.software.ibm.com/developerworks/education/l-regexp/regexp.zip
  https://www6.software.ibm.com/developerworks/education/l-regexp/regexp.pdf

* So What's A $#!%% Regular Expression, Anyway?!
  http://www.devshed.com/c/a/Administration/So-Whats-A-%24%25%25-Regular-Expression-Anyway%3F/

* Perl Regular Expression Tutorial
  http://www.english.uga.edu/humcomp/perl/regex2a.html

* A Tao of Regular Expressions
  http://sitescooper.org/tao_regexps.html

* Tutorial: Regex-Kurs (Reguläre Ausdrücke in TB)
  http://www.regenechsen.de/regex_de/regex_1_de.html
  http://www.regenechsen.de/admin/regulaere_ausdruecke_in_tb.zip

* Regular-Expressions.info (Tutorial, Examples and Reference)
  http://www.regular-expressions.info


Thorsten