Wyrażenia regularne w Pythonie zwracają prawdę / fałsz


114

Używając wyrażeń regularnych Pythona, jak uzyskać zwrot True/ Falsezwracany? Wszystkie zwroty w Pythonie to:

<_sre.SRE_Match object at ...>

Odpowiedzi:


140

Matchobiekty są zawsze prawdziwe i Nonesą zwracane, jeśli nie ma dopasowania. Po prostu sprawdź poprawność.

if re.match(...):

21
re.match (...) zwróci prawdę, jeśli początkowa część łańcucha będzie pasować do zwykłego wzorca. Podczas gdy wyszukiwanie potwierdzi wzorzec w dowolnym miejscu ciągu.
Yu Shen

8
if re.match(...) is None:Zamiast tego może być bardziej pożądane
NuclearPeon

przepraszam, czy odniosłeś się do komentarzy w swojej odpowiedzi? To dla mnie niejasne, czy możesz to wyjaśnić?
Charlie Parker

2
Czy mogę zapytać, dlaczego re jest tak zaprojektowany? Jeśli matchprzedmioty są zawsze prawdziwe, dlaczego po prostu nie wraca Truena pierwszym miejscu, skoro i tak zawsze musimy wiedzieć, czy odpowiedź jest prawdziwa, czy fałszywa?
ytu

1
@ytu: Ponieważ wtedy możesz zrobić wszystko, co musisz .
Ignacio Vazquez-Abrams

149

Jeśli naprawdę potrzebujesz Truelub False, po prostu użyjbool

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

Jak wskazywały inne odpowiedzi, jeśli używasz go tylko jako warunku dla iflub while, możesz użyć go bezpośrednio, bez zawijaniabool()


1
boolwartość jest potrzebna, gdy instrukcja warunkowa zawiera logiczną operację arytmetyczną. np .: if (re.search ("a", "abc") & True):
Aizzat Suhardi

2
@AizzatSuhardi, &jest operacją bitową . andbyłaby operacją boolowską .
John La Rooy,

1
dzięki @JohnLaRooy. korekta:(re.search("a","abc") and True)
Aizzat Suhardi

czym różni się to od odpowiedzi Ignacio?
Charlie Parker

2
Zawijanie boolsprawia, że ​​intencja programisty jest jasna dla czytelnika.
Guilherme Salomé

10

Ignacio Vazquez-Abrams ma rację. Ale aby rozwinąć, re.match()zwróci albo None, który ocenia do False, albo dopasowany obiekt, który zawsze będzie taki, Truejak powiedział. Tylko jeśli chcesz uzyskać informacje o częściach, które pasują do twojego wyrażenia regularnego, musisz sprawdzić zawartość obiektu dopasowania.


6

Jednym ze sposobów jest po prostu przetestowanie zwracanej wartości. Ponieważ otrzymujesz <_sre.SRE_Match object at ...>to, oznacza to, że zostanie to ocenione jako prawda. Jeśli wyrażenie regularne nie zostanie dopasowane, zwrócona zostanie wartość None, której wynikiem jest false.

import re

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

Produkuje hijako wyjście.


Państwo zawsze uzyskać wartość powrotną; Nonejest wartością domyślną, jeśli nic nie jest jawnie zwracane.
Ignacio Vazquez-Abrams,

Dzięki - poprawiłem to. Po prostu kierowałem się tym, co widziałem w REPL.
Gavin Anderegg,

4

Oto moja metoda:

import re
# Compile
p = re.compile(r'hi')
# Match and print
print bool(p.match("abcdefghijkl"))

1
p = re.comp il e (r'hi ') :-P
Clay

tak i zwraca „False”
Ufos

jeśli zmienisz matchna search, zwróci True
alofgran

1

Możesz użyć re.match()lub re.search(). Python oferuje dwie różne operacje prymitywne oparte na wyrażeniach regularnych: re.match()sprawdza dopasowanie tylko na początku ciągu, podczas gdy re.search()sprawdza dopasowanie w dowolnym miejscu w ciągu (tak robi domyślnie Perl). odnieś to

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.