Python 2.7.1 Ich versuche, den regulären Python-Ausdruck zu verwenden, um Wörter innerhalb eines Musters zu extrahieren
Ich habe eine Zeichenfolge, die so aussieht
someline abc
someother line
name my_user_name is valid
some more lines
Ich möchte das Wort "my_user_name" extrahieren. Ich mache so etwas
import re
s = #that big string
p = re.compile("name .* is valid", re.flags)
p.match(s) #this gives me <_sre.SRE_Match object at 0x026B6838>
Wie extrahiere ich jetzt meinen_Benutzernamen?
group(0)
für das erste Spiel ist?group(0)
Gibt den übereinstimmenden Text zurück, nicht die erste Erfassungsgruppe. Der Codekommentar ist korrekt, während Sie Capture-Gruppen und Übereinstimmungen zu verwirren scheinen.group(1)
Gibt die erste Erfassungsgruppe zurück.NameError: name '_' is not defined
_ = p.search(s)
. Ich sehe, dass erwähnt wird, dass das Ergebnis auf gesetzt wird,_
aber der Code spiegelt dies nicht wider. Ich habe zu_ = p.search(s)
dieser zweiten Zeile gewechselt und es funktioniert._
. Es ist nirgendwo anders gültig.Sie können passende Gruppen verwenden:
z.B
Hier verwende ich
re.findall
eher alsre.search
alle Instanzen von zu bekommenmy_user_name
. Mitre.search
müssen Sie die Daten aus der Gruppe für das Übereinstimmungsobjekt abrufen:Wie in den Kommentaren erwähnt, möchten Sie Ihren Regex möglicherweise nicht gierig machen:
um nur das Zeug zwischen
'name '
und dem nächsten aufzunehmen' is valid'
(anstatt zuzulassen, dass Ihr Regex andere' is valid'
in Ihrer Gruppe aufnimmt .quelle
(.*?)
? Ja, das ist möglich, aber nicht notwendig, es sei denn, wir verwendenre.DOTALL
re.findall('name (.*) is valid', 'name jon clements is valid is valid is valid')
wahrscheinlich nicht die gewünschten Ergebnisse liefern ....group
ist genau der gleiche wie die Antwort, die Sie akzeptiert haben ...Sie könnten so etwas verwenden:
quelle
Vielleicht ist das etwas kürzer und leichter zu verstehen:
quelle
Sie möchten eine Erfassungsgruppe .
quelle
Sie können Gruppen (mit
'('
und gekennzeichnet')'
) verwenden, um Teile der Zeichenfolge zu erfassen. Diegroup()
Methode des Übereinstimmungsobjekts gibt Ihnen dann den Inhalt der Gruppe:In Python 3.6+ können Sie auch in ein Übereinstimmungsobjekt indizieren, anstatt Folgendes zu verwenden
group()
:quelle
Hier ist eine Möglichkeit, dies ohne Verwendung von Gruppen zu tun (Python 3.6 oder höher):
quelle
Sie können auch eine Erfassungsgruppe verwenden
(?P<user>pattern)
und wie ein Wörterbuch auf die Gruppe zugreifenmatch['user']
.quelle
Es scheint, als ob Sie tatsächlich versuchen, einen Namen zu extrahieren, indem Sie einfach eine Übereinstimmung finden. In diesem Fall ist es hilfreich, Span-Indizes für Ihre Übereinstimmung zu haben, und ich würde die Verwendung empfehlen
re.finditer
. Als Verknüpfung wissen Sie, dass dername
Teil Ihres regulären Ausdrucks Länge 5 undis valid
Länge 9 ist, sodass Sie den passenden Text in Scheiben schneiden können, um den Namen zu extrahieren.Hinweis - In Ihrem Beispiel sieht es so aus, als wäre
s
es eine Zeichenfolge mit Zeilenumbrüchen.quelle