¿Las expresiones regulares del módulo re admiten límites de palabras (\b)?

4 minutos de lectura

¿Las expresiones regulares del modulo re admiten limites de palabras
corriente continua

Mientras intentaba aprender un poco más sobre las expresiones regulares, un tutorial sugirió que puede usar el \b para coincidir con un límite de palabra. Sin embargo, el siguiente fragmento en el intérprete de Python no funciona como se esperaba:

>>> x = 'one two three'
>>> y = re.search("\btwo\b", x)

Debería haber sido un objeto de coincidencia si algo coincidiera, pero es None.

Es el \b ¿La expresión no es compatible con Python o la estoy usando mal?

  • Esto funcionará: re.search(r"\btwo\b", x)

    – Bolo

    22 de octubre de 2010 a las 8:39

  • ¿Por qué no estás usando cadenas “en bruto”? r"\btwo\b"?

    – S. Lott

    22 de octubre de 2010 a las 10:56


  • La gente a menudo se confunde acerca de \b.

    – cristo

    18 de noviembre de 2010 a las 13:55

  • Python lo hace, solo necesitas una cadena sin formato r'\b' por lo que el personaje se escapa. (o si no doble escape \\bque es asqueroso)

    – smci

    9 de junio de 2020 a las 9:35


¿Las expresiones regulares del modulo re admiten limites de palabras
pifunc

debería estar usando cadenas en bruto en tu código

>>> x = 'one two three'
>>> y = re.search(r"\btwo\b", x)
>>> y
<_sre.SRE_Match object at 0x100418a58>
>>> 

Además, ¿por qué no intentas

word = 'two'
re.compile(r'\b%s\b' % word, re.I)

Producción:

>>> word = 'two'
>>> k = re.compile(r'\b%s\b' % word, re.I)
>>> x = 'one two three'
>>> y = k.search( x)
>>> y
<_sre.SRE_Match object at 0x100418850>

  • Interesante, gracias por el ejemplo de trabajo. ¿Tiene alguna idea de por qué el método que elegí no funciona? Los dos enfoques deberían ser iguales, excepto que en su enfoque solo está compilando una vez.

    – CC

    22 de octubre de 2010 a las 8:42

  • @darren: Mira mi último ejemplo que simplemente mejora lo que hiciste. Proporcioné cadenas sin procesar para buscar.

    – pyfunc

    22 de octubre de 2010 a las 8:44


  • ahh después de la sugerencia tuya y de Bolo, fue porque no estaba usando una cadena sin procesar. ¡Gracias!

    – CC

    22 de octubre de 2010 a las 8:46

  • -1: Al revés. Las cadenas en bruto deben ser las primeras. El otro asunto de construir una expresión re con una cadena % la sustitución es una mala tangente, irrelevante para esta pregunta en particular.

    – S. Lott

    22 de octubre de 2010 a las 10:57

  • Mala respuesta. El código funciona, pero no hay explicación alguna.

    – Aran Fey

    11 de junio de 2018 a las 13:08

Esto funcionará: re.search(r"\btwo\b", x)

Cuando escribes "\b" en Python, es un solo carácter: "\x08". Escapa de la barra invertida de esta manera:

"\\b"

o escriba una cadena sin procesar como esta:

r"\b"

  • Esto realmente me ayudó … Estaba luchando con una expresión regular similar a pyspark y no podía entender por qué \b (límite de palabra) no funcionaba. Gracias

    – jb1t

    17 de junio de 2016 a las 23:09

  • Gracias, a mi también me atrapó esto. Pero ¿por qué \d funciona bien sin cuerda cruda pero \b no?

    – Quinn Comandante

    17 dic 2020 a las 21:45

  • La observación de la doble barra invertida realmente me sacó de un aprieto. Gracias.

    – dimButTries

    14 de noviembre de 2021 a las 14:09

  • @QuinnComendant porque \d no es una secuencia de escape, consulte la tabla en docs.python.org/3/reference/…

    – usuario1556435

    10 de febrero a las 12:28

Solo para explicar explícitamente por qué re.search("\btwo\b", x) no funciona, es porque \b en una cadena de Python es una forma abreviada de un carácter de retroceso.

print("foo\bbar")
fobar

Entonces el patrón "\btwo\b" está buscando un retroceso, seguido de twoseguido de otro retroceso, que es la cadena en la que está buscando (x = 'one two three') no tiene.

Permitir re.search (o compile) para interpretar la secuencia \b como un límite de palabra, escapar de las barras invertidas ("\\btwo\\b") o use una cadena sin procesar para crear su patrón (r"\btwo\b").

¿Las expresiones regulares del modulo re admiten limites de palabras
Ciro Santilli Путлер Капут 六四事

Documentación de Python

https://docs.python.org/2/library/re.html#regular-expression-syntax

\B

Coincide con la cadena vacía, pero solo al principio o al final de una palabra. Una palabra se define como una secuencia de caracteres alfanuméricos o guiones bajos, por lo que el final de una palabra se indica mediante un espacio en blanco o un carácter no alfanumérico ni guion bajo. Tenga en cuenta que, formalmente, \b se define como el límite entre un carácter \w y \W (o viceversa), o entre \w y el principio/final de la cadena, por lo que el conjunto preciso de caracteres considerados alfanuméricos depende en los valores de las banderas UNICODE y LOCALE. Por ejemplo, r’\bfoo\b’ coincide con ‘foo’, ‘foo.’, ‘(foo)’, ‘bar foo baz’ pero no con ‘foobar’ o ‘foo3’. Dentro de un rango de caracteres, \b representa el carácter de retroceso, por compatibilidad con los literales de cadena de Python.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad