2017-12-21 4 views
4

Wie kann ich die folgende Codezeile ändern (die die Namen von Parametern in config_file liest):Ignorieren Kommentare mit Leerzeichen in regex

re.findall('Parameter.*', config_file) 

, um Linien zu ignorieren Kommentar Symbol (%) an die enthält links? d. h. im folgenden Beispiel

Parameter: A 
%Parameter: B 
    % Parameter: C 
Parameter: D %the best parameter 

nur A und D übereinstimmen?

+0

gibt es etwas, aber '%' und Räume, die zwischen den Zeilenanfang und 'Parameter' kommen könnte? –

+2

Mögliches Duplikat [Regex Look-Ahead, und Lookbehind Atomgruppen] (https://stackoverflow.com/questions/2973436/regex-lookahead-lookbehind-and-atomic-groups) –

+0

@MichaWiedenmann Ich würde behaupten, dass es zwei Teile die Frage; nach dem negativen Lookbehind fragen und nach dem Ignorieren von Whitespace fragen. Die verknüpfte Frage beantwortet diese Frage nicht vollständig. – colopop

Antwort

3

Versuchen Sie, diese Regex:

(?:(?<=^)|(?<=\n))\s*Parameter.*

Click for Demo

Erläuterung:

  • (?:(?<=^)|(?<=\n)) - findet die p osition, die von einem \n nur vorangestellt ist oder Start-of-the-string
  • \s* - Streichhölzer 0+ Vorkommen von weißen Räumen
  • Parameter.* - Spielen Parameter von 0+ Vorkommen eines beliebigen Zeichens gefolgt (mit Ausnahme von Zeilenumbrüchen)
+0

Ich war gerade dabei, einen Kommentar über den Mangel an Erklärung verlassen - danke für mich preempting. Auch ein guter Haken, dass dieses Muster nach einem Newline sowie dem Beginn der Zeichenfolge übereinstimmen kann. – colopop

+0

Dies wird nicht übereinstimmen, wenn der Eingang ist 'foo Patameter: M' aber Voraussetzung ist nur'% 'Linien – anubhava

+0

@anubhava zu ignorieren zwar richtig, dass nicht durch die OP erwähnt wurde, aber ich denke, wir können [' (:(? ? <= ^) | (? <= \ n)) [] * (?! \ s *?%). *? Parameter. * '] (https://regex101.com/r/Ss7JFZ/2) für dieser Fall. – Gurman

1

Sie können von regex Wechsel und einfangenden Gruppen in findall machen:

>>> test_str = ("Parameter: A\n" 
...  "%Parameter: B\n" 
...  " % Parameter: C\n" 
...  " Parameter: D %the best parameter") 
>>> 
>>> print filter(None, re.findall(r'%\s*Parameter|(Parameter.*)', test_str)) 
['Parameter: A', 'Parameter: D %the best parameter'] 

Spiele, die Sie wollen, sollte in einem Wechsel vor dem letzten Capturing Gruppenspiel verwerfen erscheinen.

RegEx Demo

Verwandte Themen