2012-01-25 9 views
49

tengo una expresión regular como esto:de pitón: devolver True si la expresión regular contiene en la cadena

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

función debe devolver True si la palabra contiene barra de, Baz o mal. En resumen, necesito analógica de expresiones regulares de Python para

'any-string' in 'text' 

Como puedo realizarlo? ¡Gracias!

+10

sólo tiene que utilizar '' bool (re.search ('ba [RZD]', 'SomeText ')) ''. –

Respuesta

83
import re 
word = 'fubar' 
regexp = re.compile(r'ba[rzd]') 
if regexp.search(word): 
    print 'matched' 
+0

Estoy trabajando en un caso similar en el que quiero buscar una cadena exacta ('xyz') y quiero saber cuál es la forma más eficiente de hacerlo, si utilizo' 'xyz '' de python en given_text' o uso' re.compile (r'xyz '). search (given_text) '? – bawejakunal

+1

los paréntesis '[]' contienen una clase de caracteres, por lo que su re también coincide: >>> palabra = 'ba |'; regexp.search (palabra) <_sre.SRE_Match objeto en 0x101030b28>. Puede soltar todos los símbolos de tubería. – radtek

10

Match objetos son siempre verdaderas, y None se devuelve si no hay ninguna coincidencia. Solo prueba la veracidad.

Código:

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

salida = bar

Si desea search funcionalidad

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

y si no se ha encontrado que regexp

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

Como @bukzor mencionó si st = foo bar que la coincidencia no funcionará. Entonces, es más apropiado usar re.search.

+1

Según entiendo la pregunta, OP realmente quiere 'buscar' en lugar de' emparejar'. (Consulte http://docs.python.org/library/re.html#matching-vs-searching).) Además, creo que sería útil si mostrara posibles argumentos reales, en el orden correcto, en lugar de simplemente '...'. – ruakh

+1

si cambia 'st' a' "foo bar" ', el método de coincidencia no funcionará aquí. Quieres buscar – bukzor

+0

@bukzor: tienes razón me perdí esa parte. – RanRag

0

se puede hacer algo como esto:

Uso de la búsqueda devolverá un objeto SRE_match, si coincide con la cadena de búsqueda.

>>> 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() 

Si no es así, se volverá Ninguno

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

Y sólo para imprimirlo para demostrar una vez más:

>>> print n 
None 
0

Aquí es una función que hace lo que quiere:

import re 

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

El método de búsqueda de expresión regular devuelve un objeto con éxito y Ninguno si el patrón no se encuentra en la cadena. Con eso en mente, volvemos True siempre que la búsqueda nos devuelva algo.

Ejemplos:

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

El mejor, con mucho, es

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

devuelve True

+1

es el mejor. – shaashwato

Cuestiones relacionadas