re: return True de python si la cadena contiene un patrón de expresiones regulares


98

Tengo una expresión regular como esta:

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

La función debe devolver True si la palabra contiene bar , baz o bad . En resumen, necesito regexp analógico para Python

'any-string' in 'text'

¿Cómo puedo darme cuenta? ¡Gracias!


17
Solo usa bool(re.search('ba[rzd]', 'sometext')).
Raymond Hettinger

Respuestas:


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

1
Estoy trabajando en un caso similar en el que quiero buscar una cadena exacta ( xyz) y quiero saber cuál es una forma más eficiente de hacer esto, ¿debo usar python 'xyz' in given_texto usar re.compile(r'xyz').search(given_text)?
bawejakunal

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

104

El mejor de lejos es

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

Devuelve True


2
¿Por qué esta es mejor que las otras soluciones?
kres0345

1
Por un lado, devuelve un bool. OP: "debe regresar Truesi la palabra contiene bar, baz o bad". Otras respuestas utilizan el comportamiento de if- convertir automáticamente la expresión a su derecha en a bool. p import re; rgx=re.compile(r'ba[rzd]'); rgx.search('foobar'). ej. => <re.Match object; span=(2, 5), match='bar'>, pero if(rgx.search(w)): print('y')=> y. Lo más cercano a la documentación de conversión automática que pude encontrar ( archivado )
bballdave025

15

Matchlos objetos siempre son verdaderos y Nonese devuelven si no hay 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 quieres searchfuncionalidad

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

y si regexpno se encuentra que

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

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


1
Según entiendo la pregunta, OP en realidad quiere en searchlugar de match. (Consulte docs.python.org/library/re.html#matching-vs-searching. ) Además, creo que sería útil que mostrara los posibles argumentos reales, en el orden correcto, en lugar de solo ....
ruakh

1
si cambia sta "foo bar", el método de coincidencia no funcionará aquí. Quieres buscar.
Bukzor

@ruakh ese enlace ya no se desplaza automáticamente a esa parte del documento, ahora el enlace es docs.python.org/2/library/re.html#search-vs-match
freeforall tousez

@RanRag ¿cuál es la diferencia de complejidad en la búsqueda de subcadenas con iny regex?
Piyush S. Wanare

1

Aquí hay una función que hace lo que quieres:

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 en caso de éxito y Ninguno si el patrón no se encuentra en la cadena. Con eso en mente, devolvemos 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

0

Puedes hacer algo como esto:

El uso de la búsqueda devolverá un objeto SRE_match, si coincide con su 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, devolverá Ninguno

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

Y solo para imprimirlo para demostrar nuevamente:

>>> print n
None
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.