
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?

pifunc
Tú 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>
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"
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 two
seguido 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"
).

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.
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
sí Python lo hace, solo necesitas una cadena sin formato
r'\b'
por lo que el personaje se escapa. (o si no doble escape\\b
que es asqueroso)– smci
9 de junio de 2020 a las 9:35