Expresión regular: emparejar inicio o espacios en blanco

¿Puede una expresión regular coincidir con el espacio en blanco o el inicio de una cadena?

Estoy tratando de reemplazar la abreviatura de la moneda GBP con un símbolo de £. Podría coincidir con cualquier cosa que comience con el GBP, pero me gustaría ser un poco más conservador y buscar ciertos delimitadores a su alrededor.

>>> import re >>> text = u'GBP 5 Off when you spend GBP75.00' >>> re.sub(ur'GBP([\W\d])', ur'£\g', text) # matches GBP with any prefix u'\xa3 5 Off when you spend \xa375.00' >>> re.sub(ur'^GBP([\W\d])', ur'£\g', text) # matches at start only u'\xa3 5 Off when you spend GBP75.00' >>> re.sub(ur'(\W)GBP([\W\d])', ur'\g£\g', text) # matches whitespace prefix only u'GBP 5 Off when you spend \xa375.00' 

¿Puedo hacer los dos últimos ejemplos al mismo tiempo?

Utilice el operador OR ” | “:

 >>> re.sub(r'(^|\W)GBP([\W\d])', u'\g<1>£\g<2>', text) u'\xa3 5 Off when you spend \xa375.00' 

\b es el límite de la palabra, que puede ser un espacio en blanco, el comienzo de una línea o un símbolo no alfanumérico ( \bGBP\b ).

Esto reemplaza a GBP si está precedido por el inicio de una cadena o un límite de palabra (que ya es el inicio de una cadena), y después de GBP viene un valor numérico o un límite de palabra:

 re.sub(u'\bGBP(?=\b|\d)', u'£', text) 

Esto elimina la necesidad de cualquier referencia inversa innecesaria mediante el uso de un lookahead . ¿Lo suficientemente inclusivo?

Creo que estás buscando '(^|\W)GBP([\W\d])'

Siempre puede recortar los espacios en blanco iniciales y finales del token antes de buscar si no es una situación de coincidencia / agrupación que requiere la línea completa.

¿Si por qué no?

 re.sub(u'^\W*GBP... 

coincide con el inicio de la cadena, 0 o más espacios en blanco, luego GBP …

edición : Oh, creo que quieres alternancia, usa el | :

 re.sub(u'(^|\W)GBP... 

Funciona en Perl:

 $text = 'GBP 5 off when you spend GBP75'; $text =~ s/(\W|^)GBP([\W\d])/$1\$$2/g; printf "$text\n"; 

La salida es:

 $ 5 off when you spend $75 

Tenga en cuenta que estipulé que la coincidencia debería ser global, para obtener todas las apariciones.