Reguläre Python-Ausdrücke geben true / false zurück

114

Wie können Sie mit regulären Python-Ausdrücken ein True/ Falsezurückgeben? Alle Python-Rückgaben sind:

<_sre.SRE_Match object at ...>
niemand
quelle

Antworten:

140

MatchObjekte sind immer wahr und Nonewerden zurückgegeben, wenn keine Übereinstimmung vorliegt. Testen Sie einfach die Richtigkeit.

if re.match(...):
Ignacio Vazquez-Abrams
quelle
21
re.match (...) würde true zurückgeben, wenn der Anfangsteil der Zeichenfolge mit dem regulären Muster übereinstimmt. Während der Suche wird das Muster an einer beliebigen Stelle in der Zeichenfolge bestätigt.
Yu Shen
8
Es kann wünschenswerter sein, if re.match(...) is None:stattdessen zu verwenden
NuclearPeon
Entschuldigung, haben Sie die Kommentare in Ihrer Antwort angesprochen? Es ist mir unklar, macht es Ihnen etwas aus, das zu klären?
Charlie Parker
2
Darf ich fragen, warum das re so gestaltet ist? Wenn matchObjekte immer wahr sind, warum kehrt sie dann nicht gleich zurück True, da wir immer wissen müssen, ob die Antwort überhaupt wahr oder falsch ist?
ytu
1
@ytu: Weil du dann alles andere tun kannst, was du brauchst .
Ignacio Vazquez-Abrams
148

Wenn Sie wirklich brauchen Trueoder False, verwenden Sie einfachbool

>>> bool(re.search("hi", "abcdefghijkl"))
True
>>> bool(re.search("hi", "abcdefgijkl"))
False

Wie andere Antworten bereits gezeigt haben , können Sie es direkt verwenden, ohne es einzuschließen , wenn Sie es nur als Bedingung für ein ifoder whileverwendenbool()

John La Rooy
quelle
1
boolWert wird benötigt, wenn die bedingte Anweisung eine boolesche arithmetische Operation enthält. Beispiel: if (re.search ("a", "abc") & True):
Aizzat Suhardi
2
@AizzatSuhardi, &ist eine bitweise Operation. andwäre die boolesche Operation.
John La Rooy
1
danke @JohnLaRooy. Korrektur:(re.search("a","abc") and True)
Aizzat Suhardi
Wie unterscheidet sich das von Ignacios Antwort?
Charlie Parker
2
Das Einwickeln boolmacht dem Leser die Absicht des Programmierers klar.
Guilherme Salomé
10

Ignacio Vazquez-Abrams ist richtig. Aber um näher darauf einzugehen, re.match()wird entweder zurückgegeben None, was ausgewertet wird False, oder ein Übereinstimmungsobjekt, das immer so sein wird, Truewie er es gesagt hat. Nur wenn Sie Informationen zu den Teilen wünschen, die Ihrem regulären Ausdruck entsprechen, müssen Sie den Inhalt des Übereinstimmungsobjekts überprüfen.

cory
quelle
6

Eine Möglichkeit, dies zu tun, besteht darin, nur den Rückgabewert zu testen. Weil Sie es bekommen <_sre.SRE_Match object at ...>, bedeutet dies, dass dies als wahr bewertet wird. Wenn der reguläre Ausdruck nicht übereinstimmt, erhalten Sie den Rückgabewert None, der als false ausgewertet wird.

import re

if re.search("c", "abcdef"):
    print "hi"

Produziert hials Ausgabe.

Gavin Anderegg
quelle
Sie erhalten immer einen Rückgabewert. Noneist die Standardeinstellung, wenn nichts explizit zurückgegeben wird.
Ignacio Vazquez-Abrams
Danke - das korrigiert. Ich habe mich nur an das gehalten, was ich in der REPL gesehen habe.
Gavin Anderegg
4

Hier ist meine Methode:

import re
# Compile
p = re.compile(r'hi')
# Match and print
print bool(p.match("abcdefghijkl"))
Vaibhav Desai
quelle
1
p = re.comp il e (r'hi ') :-P
Clay
Ja, und es gibt "False" zurück
Ufos
wenn Sie ändern matchzu search, wird es wahr zurückgeben
alofgran
1

Sie können re.match()oder verwenden re.search(). Python bietet zwei verschiedene primitive Operationen, die auf regulären Ausdrücken basieren: re.match()Überprüft nur am Anfang der Zeichenfolge, re.search()ob eine Übereinstimmung vorliegt , während an einer beliebigen Stelle in der Zeichenfolge nach einer Übereinstimmung gesucht wird (dies ist standardmäßig bei Perl der Fall). verweisen Sie dies

Sashini Hettiarachchi
quelle