2017-03-23 2 views
1

Ich habe ein Python-Skript, das mit einer anderen Anwendung kommuniziert (ein Debugger mit einem eingebetteten Ziel, um genau zu sein) mit einer Socket-Verbindung. Die Antworten vom Debugger können unterschiedlich lang sein und mehrere Zeilen umfassen, aber sie enden immer mit True\r\n oder False\r\n. Ich möchte True oder False einschließlich der Newline-Zeichen erfassen.Suche nach Substring einschließlich Carriage Return und Newline-Zeichen

Der reguläre Ausdruck Ich verwende (z r'^[.]+|[\r]+|[\n]+(True\r\n)$' für True) scheint, wenn sie auf regex101.com getestet zu arbeiten, aber nur zurückgibt \r, wenn sie mit Python laufen.

Beispielcode mit einer Probe Antwortstring:

import re 
sample_response = 'var0 = 0x00000001\r\nTrue\r\n' 
re_true = re.compile(r'^[.]+|[\r]+|[\n]+(True\r\n)$') 
print re_true.search(sample_response).group(0) # Will print out '\r' 

Ich weiß, dass es etwas grundlegend falsch mit der Regex ist ich verwende. Ich habe auch versucht, positive Lookbehind wie unten gezeigt und das scheint zu funktionieren, aber ich bin mir nicht sicher, ob dies der richtige Weg, dies zu tun:

import re 
sample_response = 'var0 = 0x00000001\r\nTrue\r\n' 
re_true = re.compile(r'(?<=(True\r\n))') 
print re_true.search(sample_response).group(0) # Will print out '' 
print re_true.search(sample_response).group(1) # Will print out 'True\r\n' 
+0

Ja, aber regex101 hat kein '\ r', sein Zeilenumbruch ist' \ n'. Deine Regex stimmt mit '\ r' in deiner Eingabe überein, bevor du den' True' Part ausprobierst und es ist die erste Alternative, die in NFA regex gewinnt. Versuchen Sie 're.findall' oder überdenken Sie die Anforderungen. –

+0

Yup, ich benutze \ n auf regex101.com zum Testen meiner Regex ... unabhängig davon, die regex101 Referenz war wahrscheinlich TMI und ist nicht wirklich meine Frage :) – schaazzz

+0

Ich werde mit findall testen ... danke! – schaazzz

Antwort

1

Sie Sie True\r\n oder False\r\n müssen sagen entsprechen, dann ist die ^[.]+|[\r]+| in Ihrem Muster redundant. Verwenden Sie

re.search(r'[\r\n]*\b(?:True|False)[\r\n]*$', s) 

Oder lassen Sie den anfänglichen [\r\n]*, wenn Sie keine Zeilenumbrüche müssen, bevor True oder False.

Einzelheiten:

  • [\r\n]* - null oder mehr CR oder LF Symbole
  • \b - eine Wortgrenze
  • (?:True|False) - entweder True oder False als ganze Wörter
  • [\r\n]* - wie oben
  • $ - e nd der Zeichenkette.
Verwandte Themen