Expressões regulares Python retornam verdadeiro / falso

114

Usando expressões regulares Python, como você pode obter um True/ Falseretornado? Todos os retornos do Python são:

<_sre.SRE_Match object at ...>
ninguém
fonte

Respostas:

140

Matchobjetos são sempre verdadeiros e Nonesão retornados se não houver correspondência. Apenas teste a veracidade.

if re.match(...):
Ignacio Vazquez-Abrams
fonte
21
re.match (...) retornaria verdadeiro se a parte inicial da string corresponder ao padrão regular. Enquanto a pesquisa irá confirmar o padrão em qualquer lugar da string.
Yu Shen
8
Pode ser mais desejável usar em if re.match(...) is None:vez disso
NuclearPeon 01 de
desculpe, você respondeu aos comentários? Não está claro para mim, você se importa em esclarecer?
Charlie Parker
2
Posso perguntar por que re foi projetado assim? Se os matchobjetos são sempre verdadeiros, por que simplesmente não retorna Trueem primeiro lugar, visto que sempre precisamos saber se a resposta é verdadeira ou falsa de qualquer maneira?
ytu
1
@ytu: Porque então você pode fazer tudo o que precisar .
Ignacio Vazquez-Abrams
149

Se você realmente precisa Trueou False, basta usarbool

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

Como outras respostas apontaram, se você estiver usando-o apenas como uma condição para um ifou while, você pode usá-lo diretamente, sem envolver embool()

John La Rooy
fonte
1
boolvalor é necessário quando a instrução condicional contém operação aritmética booleana. Ex: if (re.search ("a", "abc") & True):
Aizzat Suhardi
2
@AizzatSuhardi, &é uma operação bit a bit . andseria a operação booleana .
John La Rooy de
1
obrigado @JohnLaRooy. correção:(re.search("a","abc") and True)
Aizzat Suhardi
como isso é diferente da resposta de Ignacio?
Charlie Parker
2
O empacotamento booltorna a intenção do programador clara para o leitor.
Guilherme Salomé
10

Ignacio Vazquez-Abrams está correto. Mas para elaborar, re.match()retornará ou None, que avalia para False, ou um objeto de correspondência, que será sempre Truecomo ele disse. Somente se você quiser informações sobre as partes que correspondem à sua expressão regular, você precisa verificar o conteúdo do objeto de correspondência.

Cory
fonte
6

Uma maneira de fazer isso é apenas testar o valor de retorno. Porque você está entendendo <_sre.SRE_Match object at ...>, significa que isso será avaliado como verdadeiro. Quando a expressão regular não for correspondida, você retornará o valor None, que é avaliado como false.

import re

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

Produz hicomo saída.

Gavin Anderegg
fonte
Você sempre obtém um valor de retorno; Noneé o padrão se nada for retornado explicitamente.
Ignacio Vazquez-Abrams
Obrigado - corrigido isso. Eu estava apenas seguindo o que vi no REPL.
Gavin Anderegg
4

Aqui está o meu método:

import re
# Compile
p = re.compile(r'hi')
# Match and print
print bool(p.match("abcdefghijkl"))
Vaibhav Desai
fonte
1
p = re.comp il e (r'hi ') :-P
Clay
sim e retorna "False"
Ufos
se você mudar matchpara search, ele retornará True
alofgran
1

Você pode usar re.match()ou re.search(). Python oferece duas operações primitivas diferentes baseadas em expressões regulares: re.match()verifica se há uma correspondência apenas no início da string, enquanto re.search()verifica se há uma correspondência em qualquer lugar da string (é isso que o Perl faz por padrão). consulte isso

Sashini Hettiarachchi
fonte