2016-08-02 2 views
3

Lassen Sie uns sagen, wir haben einen StringWie zeichne ich Zeichenkette zwischen bestimmten Zeichen und String in mehrzeiligen String? Python

string="This is a test code [asdf -wer -a2 asdf] >(ascd asdfas -were)\ 

test \ 

(testing test) test >asdf \ 

     test" 

Ich brauche die Zeichenfolge zwischen Zeichen zu bekommen> und Zeichenfolge "test".

Ich versuchte

re.findall(r'>[^)](.*)test',string, re.MULTILINE) 

aber ich

(ascd asdfas -were)\ test \ (testing test) test >asdf. 

bekommen aber ich brauche:

(ascd asdfas -were)\ 

UND

asdf 

Wie kann ich diese 2 Saiten bekommen?

+0

Also habe ich versucht, Ihre Code-Blöcke zu reparieren, können Sie bestätigen, dass sie so sind, wie Sie es beabsichtigten? – jedwards

+0

Danke. Das ist, was ich wollte – Sam

+1

Hier ist ein großer Regex-Builder helfen Sie testen https://regex101.com/#python – ti7

Antwort

2

Was:

import re 

s="""This is a test code [asdf -wer -a2 asdf] >(ascd asdfas -were) 
test 
(testing test) test >asdf 
test""" 

print(re.findall(r'>(.*?)\btest\b', s, re.DOTALL)) 

Ausgang:

['(ascd asdfas -were)\n', 'asdf\n'] 

Die einzige etwas interessantesten Teile dieses Musters sind:

  • .*?, wo ? die .* "ungreedy" macht, andernfalls hättest du ein einzelnes, langes Match statt zwei.
  • Verwenden \btest\b als die "Ending" -Kennung (siehe Jans Kommentar unten) anstelle von test. Where,

    \b den leeren String, aber nur am Anfang oder Ende eines Wortes ....

Hinweis, kann es auf re.DOTALL lesen werden, wie ich glaube, das ist wirklich was Sie wollen. DOTALL können . Zeichen Zeilenumbrüche enthalten, während MULTILINE Anker (^, $) Anfang und Ende von Zeilen anstelle der gesamten Zeichenfolge übereinstimmen. In Anbetracht der Tatsache, dass Sie keine Anker verwenden, denke ich DOTALL ist besser geeignet.

+1

Vielen Dank. Genau das habe ich gesucht. Ich schätze die Erklärung auch. Ich werde diese Antwort akzeptieren, sobald ich erlaubt bin. – Sam

+1

Bitte beachten Sie, dass dies "test" in "tester", "testerfield", "testman" (Sie haben die Idee) auch - Wortgrenzen auch anwenden: '\ btest \ b'. – Jan

+0

@Jan, das ist eine gute Idee, wird das bearbeiten. – jedwards

Verwandte Themen