2010-10-22 14 views
56

Al intentar aprender un poco más sobre expresiones regulares, un tutorial sugirió que puede usar la \ b para hacer coincidir un límite de palabras. Sin embargo, el siguiente fragmento en el intérprete de Python no funciona como se esperaba:¿El módulo de Python admite límites de palabra ( b)?

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

y debería haber sido un objeto partido si nada fue igualada, pero es Ninguno. ¿La expresión \ b no es compatible con Python o la estoy usando mal?

gracias por cualquier ayuda.

+20

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

+4

¿Por qué no usa cadenas "en bruto"? 'r" \ btwo \ b "'? –

+0

Las personas están [a menudo confundidas] (http://stackoverflow.com/questions/4213800/is-there-something-like-a-counter-variable-in-regular-expression-replace/4214173#4214173) about '\ b '. – tchrist

Respuesta

58

¿Por qué no pruebas

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

Salida:

>>> 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> 

también se olvidó de mencionar, usted debe utilizar cuerdas primas en el código

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

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 los mismos, excepto que en su enfoque solo compila una vez. –

+0

@darren: Vea mi último ejemplo que simplemente mejora lo que hizo. Proporcioné cadenas sin procesar para buscar. – pyfunc

+1

ahh después de la tuya y la sugerencia de Bolo, fue porque no estaba usando una cadena en bruto. ¡Gracias! –

50

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

Cuando escribe "\b" en Python, tiene un solo carácter: "\x08". O bien escapar de la barra invertida como esto:

"\\b" 

o escribir una cadena de texto en este aspecto:

r"\b" 
+2

Esto realmente me ayudó ... Estaba luchando con una expresión regular pyspark rlike y no pude entender por qué el \ b (límite de palabras) no funcionaba. Gracias – jb1t

3

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 de subrayado, por lo que el final de una palabra se indica mediante espacios en blanco o un carácter no alfanumérico y sin subrayado. Tenga en cuenta que formalmente, \ b se define como el límite entre un carácter \ w y un \ 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 los indicadores UNICODE y LOCALE. Por ejemplo, r '\ bfoo \ b' coincide con 'foo', 'foo.', '(Foo)', 'bar foo baz' pero no 'foobar' o 'foo3'. Dentro de un rango de caracteres, \ b representa el carácter de retroceso, para la compatibilidad con los literales de cadenas de Python.

Cuestiones relacionadas