Python expresión regular coincide con toda la palabra

Tengo problemas para encontrar la expresión regular correcta para el siguiente escenario:

Digamos:

a = "this is a sample" 

Quiero hacer coincidir toda la palabra; por ejemplo, "hi" debería devolver Falso, ya que "hi" no es una palabra y "is" debería devolver la Verdad, ya que no hay ningún carácter alfa a la izquierda ni a la derecha.

Tratar

 re.search(r'\bis\b', your_string) 

De los documentos :

\ b Coincide con la cadena vacía, pero solo al principio o al final de una palabra.

Tenga en cuenta que el módulo re utiliza una definición ingenua de “palabra” como una “secuencia de caracteres alfanuméricos o de subrayado”, donde “alfanumérico” depende de las opciones de configuración regional o Unicode.

También tenga en cuenta que sin el prefijo de cadena sin formato, \b se ve como “retroceso” en lugar del límite de palabras de expresiones regulares.

Intente usar la clase de caracteres “límite de palabra” en el módulo de expresiones regulares, re :

 x="this is a sample" y="this isis a sample." regex=re.compile(r"\bis\b") # For ignore case: re.compile(r"\bis\b", re.IGNORECASE) regex.findall(y) [] regex.findall(x) ['is'] 

De la documentación de re.search() .

\b coincide con la cadena vacía, pero solo al principio o al final de una palabra

Por ejemplo, r'\bfoo\b' coincide con 'foo' , 'foo.' , '(foo)' , 'bar foo baz' pero no 'foobar' o 'foo3'

Creo que el comportamiento deseado por el OP no se logró completamente usando las respuestas dadas. Específicamente, la salida deseada de un booleano no se logró. Las respuestas proporcionadas ayudan a ilustrar el concepto, y creo que son excelentes. Quizás pueda ilustrar lo que quiero decir al afirmar que creo que el OP utilizó los ejemplos utilizados debido a lo siguiente.

La cadena dada fue,

a = "this is a sample"

El OP entonces declaró,

Quiero hacer coincidir una palabra completa, por ejemplo, "hi" debería devolver False ya que "hi" no es una palabra …

Según tengo entendido, la referencia es al token de búsqueda, "hi" tal como se encuentra en la palabra "this" . Si alguien buscara la cadena, a para la palabra "hi" , debería recibir False como respuesta.

El OP continúa,

… y "is" debería devolver True ya que no hay ningún carácter alfa a la izquierda ni a la derecha.

En este caso, la referencia es al token de búsqueda "is" como se encuentra en la palabra "is" . Espero que esto ayude a aclarar las cosas de por qué usamos los límites de palabras. Las otras respuestas tienen el comportamiento de “no devolver una palabra a menos que esa palabra se encuentre sola, no dentro de otras palabras”. La clase de caracteres abreviados de “límite de palabra” hace este trabajo muy bien.

Solo la palabra "is" se ha usado en ejemplos hasta este momento. Creo que estas respuestas son correctas, pero creo que hay más del significado fundamental de la pregunta que debe abordarse. El comportamiento de otras cadenas de búsqueda se debe tener en cuenta para comprender el concepto. En otras palabras, necesitamos generalizar la respuesta (excelente) por @georg usando re.match(r"\bis\b", your_string) El mismo concepto r"\bis\b" también se usa en la respuesta por @OmPrakash , quien inició la discusión generalizando mostrando

 >>> y="this isis a sample." >>> regex=re.compile(r"\bis\b") # For ignore case: re.compile(r"\bis\b", re.IGNORECASE) >>> regex.findall(y) [] 

Digamos que el método que debe exhibir el comportamiento que he discutido se llama

 find_only_whole_word(search_string, input_string) 

El siguiente comportamiento debe ser esperado.

 >>> a = "this is a sample" >>> find_only_whole_word("hi", a) False >>> find_only_whole_word("is", a) True 

Una vez más, así es como entiendo la pregunta del OP. Tenemos un paso hacia ese comportamiento con la respuesta de @georg, pero es un poco difícil de interpretar / implementar. esto es

 >>> import re >>> a = "this is a sample" >>> re.search(r"\bis\b", a) <_sre.SRE_Match object; span=(5, 7), match='is'> >>> re.search(r"\bhi\b", a) >>> 

No hay salida del segundo comando. La respuesta útil de @OmPrakesh muestra resultados, pero no True o False .

Aquí hay una muestra más completa del comportamiento que se espera.

 >>> find_only_whole_word("this", a) True >>> find_only_whole_word("is", a) True >>> find_only_whole_word("a", a) True >>> find_only_whole_word("sample", a) True # Use "ample", part of the word, "sample": (s)ample >>> find_only_whole_word("ample", a) False # (t)his >>> find_only_whole_word("his", a) False # (sa)mpl(e) >>> find_only_whole_word("mpl", a) False # Any random word >>> find_only_whole_word("applesauce", a) False >>> 

Esto se puede lograr mediante el siguiente código:

 #!/usr/bin/env python3 # -*- coding: utf-8 -*- # #@file find_only_whole_word.py import re def find_only_whole_word(search_string, input_string): # Create a raw string with word boundaries from the user's input_string raw_search_string = r"\b" + search_string + r"\b" match_output = re.search(raw_search_string, input_string) ##As noted by @OmPrakesh, if you want to ignore case, uncomment ##the next two lines #match_output = re.search(raw_search_string, input_string, # flags=re.IGNORECASE) no_match_was_found = ( match_output is None ) if no_match_was_found: return False else: return True ##endof: find_only_whole_word(search_string, input_string) 

Una simple demostración sigue. Ejecute el intérprete de Python desde el mismo directorio donde guardó el archivo, find_only_whole_word.py .

 >>> from find_only_whole_word import find_only_whole_word >>> a = "this is a sample" >>> find_only_whole_word("hi", a) False >>> find_only_whole_word("is", a) True >>> find_only_whole_word("cucumber", a) False # The excellent example from @OmPrakash >>> find_only_whole_word("is", "this isis a sample") False >>> 

El problema con las expresiones regulares es que si la cadena hte que desea buscar en otra cadena tiene caracteres de expresiones regulares, se complica. cualquier cadena con corchetes fallará

Este código encontrará una palabra.

  word="is" srchedStr="this is a sample" if srchedStr.find(" "+word+" ") >=0 or \ srchedStr.endswith(" "+word):  

La primera parte de las búsquedas condicionales para el texto con un espacio en cada lado y la segunda parte atrapa el final de la situación de la cadena. Tenga en cuenta que el final es booleano, mientras que el find devuelve un entero