Bedenken Sie, ich habe den folgenden Text: Temp:C5E501374D0343090957F7E5929E765C931F7D3EC7A96189FDA88549D54D9E4E5DB3FC1C2, adfsafd1242412,

Und ich möchte alle Daten nach Temp: und bis zum ersten Auftreten von , abfangen, was bedeutet: C5E501374D0343090957F7E5929E765C931F7D3EC7A96189FDA88549D54D9E4E5DB3FC1C2

Ich habe versucht, Regex Temp:(.+,) ohne Erfolg zu verwenden
Wie sage ich der Regex, dass , als erstes gefunden werden soll?

6
JavaSa 18 Aug. 2015 im 23:47

4 Antworten

Beste Antwort

Um den gewünschten Wert zu erfassen, können Sie versuchen, Lazy Matching Dot (.+?) zu verwenden. entspricht 1 oder mehr Zeichen - aber so wenig wie möglich - das sind alle Zeichen außer einer neuen Zeile):

Temp:(.+?),

Da Lazy Matching möglicherweise mehr verschlingt als Sie benötigen, wird eine negierte Zeichenklasse ([^,]+ entspricht 1 oder mehr anderen Zeichen als einem Komma) sieht vorzuziehen:

Temp:([^,]+)

Das Ergebnis wird mit der Erfassungsgruppe (Klammern) in Gruppe 1 erfasst.

IDEONE-Beispielcode:

import re
p = re.compile(r'Temp:([^,]+)')
test_str = "Temp:C5E501374D0343090957F7E5929E765C931F7D3EC7A96189FDA88549D54D9E4E5DB3FC1C2, adfsafd1242412,"
print (re.search(p, test_str).group(1))

Ausgabe: C5E501374D0343090957F7E5929E765C931F7D3EC7A96189FDA88549D54D9E4E5DB3FC1C2

HINWEIS , dass eine auf Look-Around basierende Lösung ressourcenintensiver ist als die von Ihnen und mir verwendete Erfassungsgruppe.

12
Wiktor Stribiżew 19 Aug. 2015 im 05:49

Sie müssen das Zeichen ? verwenden, um das + ungreedy zu machen. Andernfalls stimmen alle , Zeichen auch mit dem .+ Teil der Regex überein. In meiner Antwort habe ich das , aus der Gruppe verschoben, da ich anhand Ihrer Beschreibung verstanden habe, dass Sie es im Match eigentlich nicht wollten.

import re
matcher = re.compile("Temp:(.+?),")
matcher.match(a).group(1)
2
wojtossfm 18 Aug. 2015 im 20:57

Versuchen Sie den folgenden regulären Ausdruck: Temp:([^,]+,)

Jetzt ist alles nach Temp: bis zum ersten , enthalten.

0
Tomasz Nguyen 18 Aug. 2015 im 21:25

Sie können diesen Lookbehind-basierten regulären Ausdruck verwenden:

(?<=Temp:)[^,]+

RegEx Demo

Code :

s='Temp:C5E501374D0343090957F7E5929E765C931F7D3EC7A96189FDA88549D54D9E4E5DB3FC1C2, adfsafd1242412,'
print re.search(r"(?<=Temp:)[^,]+", s).group()

Ausgabe:

C5E501374D0343090957F7E5929E765C931F7D3EC7A96189FDA88549D54D9E4E5DB3FC1C2
2
anubhava 18 Aug. 2015 im 20:53