re: return do python True se a string contiver padrão regex

98

Eu tenho uma expressão regular como esta:

regexp = u'ba[r|z|d]'

A função deve retornar True se a palavra contiver bar , baz ou bad . Em suma, preciso de regexp analógico para Python

'any-string' in 'text'

Como posso perceber isso? Obrigado!

ghostmansd
fonte
17
Basta usar bool(re.search('ba[rzd]', 'sometext')).
Raymond Hettinger

Respostas:

152
import re
word = 'fubar'
regexp = re.compile(r'ba[rzd]')
if regexp.search(word):
  print 'matched'
Mattbornski
fonte
1
Estou trabalhando em um caso semelhante em que desejo procurar uma string exata ( xyz) e quero saber qual é a maneira mais eficiente de fazer isso, devo usar o python 'xyz' in given_textou usar re.compile(r'xyz').search(given_text)?
bawejakunal
1
os []colchetes contêm uma classe de caractere, então seu re também corresponde: >>> word = 'ba |'; regexp.search (word) <objeto _sre.SRE_Match em 0x101030b28>. Você pode soltar todos os símbolos de tubos.
radtek
104

O melhor de longe é

bool(re.search('ba[rzd]', 'foobarrrr'))

Retorna verdadeiro

Venu Murthy
fonte
2
Por que esta é melhor do que as outras soluções?
kres0345
1
Por um lado, ele retorna um bool. OP: "deve retornar Truese a palavra contiver bar, baz ou ruim." Outras respostas usam o comportamento de if- conversão automática da expressão à sua direita em a bool. por exemplo, import re; rgx=re.compile(r'ba[rzd]'); rgx.search('foobar')=> <re.Match object; span=(2, 5), match='bar'>, mas if(rgx.search(w)): print('y')=> y. Mais
perto
15

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

Código:

>>> st = 'bar'
>>> m = re.match(r"ba[r|z|d]",st)
>>> if m:
...     m.group(0)
...
'bar'

Saída = bar

Se você quiser searchfuncionalidade

>>> st = "bar"
>>> m = re.search(r"ba[r|z|d]",st)
>>> if m is not None:
...     m.group(0)
...
'bar'

e se regexpnão for encontrado, então

>>> st = "hello"
>>> m = re.search(r"ba[r|z|d]",st)
>>> if m:
...     m.group(0)
... else:
...   print "no match"
...
no match

Como @bukzor mencionou, se st = foo barthan match não funcionará. Portanto, é mais apropriado usar re.search.

RanRag
fonte
1
Pelo que entendi a pergunta, a OP realmente quer, em searchvez de match. (Consulte docs.python.org/library/re.html#matching-vs-searching. ) Além disso, acho que seria útil se você mostrasse os argumentos reais possíveis, na ordem correta, em vez de apenas ....
ruakh
1
se você mudar stpara "foo bar", o método de correspondência não funcionará aqui. Você quer pesquisar.
bukzor
@ruakh esse link não rola mais automaticamente para essa parte do documento, agora o link é docs.python.org/2/library/re.html#search-vs-match
freeforall tousez
@RanRag qual é a diferença de complexidade em pesquisar substring com in e regex?
Piyush S. Wanare
1

Esta é uma função que faz o que você deseja:

import re

def is_match(regex, text):
    pattern = re.compile(regex, text)
    return pattern.search(text) is not None

O método de pesquisa de expressão regular retorna um objeto em caso de sucesso e Nenhum se o padrão não for encontrado na string. Com isso em mente, retornamos True, desde que a busca nos dê algo em troca.

Exemplos:

>>> is_match('ba[rzd]', 'foobar')
True
>>> is_match('ba[zrd]', 'foobaz')
True
>>> is_match('ba[zrd]', 'foobad')
True
>>> is_match('ba[zrd]', 'foobam')
False
Kylan
fonte
0

Você pode fazer algo assim:

O uso de pesquisa retornará um objeto SRE_match, se ele corresponder à sua string de pesquisa.

>>> import re
>>> m = re.search(u'ba[r|z|d]', 'bar')
>>> m
<_sre.SRE_Match object at 0x02027288>
>>> m.group()
'bar'
>>> n = re.search(u'ba[r|z|d]', 'bas')
>>> n.group()

Caso contrário, ele retornará Nenhum

Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    n.group()
AttributeError: 'NoneType' object has no attribute 'group'

E apenas imprimi-lo para demonstrar novamente:

>>> print n
None
James R
fonte