Imagine que está tratando de hacer coincidir el patrón "stackoverflow".
Quieres lo siguiente:
this is stackoverflow and it rocks [MATCH]
stackoverflow is the best [MATCH]
i love stackoverflow [MATCH]
typostackoverflow rules [NO MATCH]
i love stackoverflowtypo [NO MATCH]
Sé cómo analizar stackoverflow si tiene espacios en ambos sitios usando:
/\s(stackoverflow)\s/
Lo mismo con si está al principio o al final de una cadena:
/^(stackoverflow)\s/
/\s(stackoverflow)$/
Pero, ¿cómo se especifica "espacio o final de cadena" y "espacio o inicio de cadena" utilizando una expresión regular?
regex
preg-match
anónimo uno
fuente
fuente
\b
es una afirmación de ancho cero; nunca consume ningún personaje. No hay necesidad de envolverlo en una búsqueda.\b
es ASCII estándar , es decir, no es compatible con Unicode. Si necesita unir palabras Unicode, no tiene más remedio que usar esto en su lugar: stackoverflow.com/a/6713327/1329367(?:^|\s)
(?<=\s|^)
con(?:(?<=\s)|(?<=^))
. De lo contrario, obtendráerror: look-behind requires fixed-width pattern
\b
consideraría otros caracteres, como ".
" como separadores de palabras, mientras que el autor de la pregunta dijo específicamente "espacio". La solución de @ gordy parece mejor.(^|\s)
coincidiría con el espacio o el inicio de la cadena y($|\s)
para el espacio o el final de la cadena. Juntos es:fuente
$1string$2
.$
y^
en una clase de caracteres, pero esto muestra que sólo se puede poner en un grupo patrón regular.Esto es lo que usaría:
En otras palabras, haga coincidir "stackoverflow" si no está precedido por un carácter que no sea un espacio en blanco y no esté seguido por un carácter que no sea un espacio en blanco.
Esto es más ordenado (IMO) que el enfoque de "espacio o ancla", y no asume que la cadena comienza y termina con caracteres de palabras como lo hace el
\b
enfoque.fuente
\b
coincide en los límites de las palabras (sin coincidir con ningún carácter), por lo que lo siguiente debe hacer lo que desee:fuente
mystr = r'\bstack overflow\b'