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!
Respuestas:
import re
word = 'fubar'
regexp = re.compile(r'ba[rzd]')
if regexp.search(word):
print 'matched'
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)?
[]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.
El mejor de lejos es
bool(re.search('ba[rzd]', 'foobarrrr'))
Devuelve True
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 )
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.
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 ....
sta "foo bar", el método de coincidencia no funcionará aquí. Quieres buscar.
iny regex?
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
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
bool(re.search('ba[rzd]', 'sometext')).