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.
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 isnotNone:... 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.
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.
@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)isnotNone
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.
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'
bool(re.search('ba[rzd]', 'sometext'))
.Respuestas:
fuente
xyz
) y quiero saber cuál es una forma más eficiente de hacer esto, ¿debo usar python'xyz' in given_text
o usarre.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
Devuelve True
fuente
bool
. OP: "debe regresarTrue
si la palabra contiene bar, baz o bad". Otras respuestas utilizan el comportamiento deif
- convertir automáticamente la expresión a su derecha en abool
. pimport re; rgx=re.compile(r'ba[rzd]'); rgx.search('foobar')
. ej. =><re.Match object; span=(2, 5), match='bar'>
, peroif(rgx.search(w)): print('y')
=>y
. Lo más cercano a la documentación de conversión automática que pude encontrar ( archivado )Match
los objetos siempre son verdaderos yNone
se devuelven si no hay coincidencia. Solo prueba la veracidad.Código:
Salida =
bar
Si quieres
search
funcionalidady si
regexp
no se encuentra queComo mencionó @bukzor, si st =
foo bar
que la coincidencia no funcionará. Entonces, es más apropiado usarlore.search
.fuente
search
lugar dematch
. (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...
.st
a"foo bar"
, el método de coincidencia no funcionará aquí. Quieres buscar.in
yregex
?Aquí hay una función que hace lo que quieres:
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:
fuente
Puedes hacer algo como esto:
El uso de la búsqueda devolverá un objeto SRE_match, si coincide con su cadena de búsqueda.
Si no, devolverá Ninguno
Y solo para imprimirlo para demostrar nuevamente:
fuente