Imagine que você está tentando padronizar a correspondência "stackoverflow".
Você deseja o seguinte:
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]
Eu sei como analisar o stackoverflow se houver espaços nos dois sites usando:
/\s(stackoverflow)\s/
O mesmo se no início ou no final de uma string:
/^(stackoverflow)\s/
/\s(stackoverflow)$/
Mas como você especifica "espaço ou final de sequência" e "espaço ou início de sequência" usando uma expressão regular?
regex
preg-match
anônimo-um
fonte
fonte
\b
é uma afirmação de largura zero; nunca consome caracteres. Não há necessidade de envolvê-lo em uma visão geral.\b
é apenas padrão ASCII , ou seja, não há suporte a unicode. Se você precisar corresponder palavras unicode, não terá outra opção senão usá-las: stackoverflow.com/a/6713327/1329367(?:^|\s)
(?<=\s|^)
por(?:(?<=\s)|(?<=^))
. Caso contrário, você começaerror: look-behind requires fixed-width pattern
\b
considerariam outros caracteres - como ".
" como quebra-palavras, enquanto o solicitante disse especificamente "espaço". A solução do @ gordy parece melhor.(^|\s)
corresponderia ao espaço ou início da sequência e($|\s)
ao espaço ou final da sequência. Juntos, é:fonte
$1string$2
.$
e^
entrar em uma classe de personagem, mas isso mostra que eles podem ser colocados em um grupo de padrões regular.Aqui está o que eu usaria:
Em outras palavras, combine "stackoverflow" se não for precedido por um caractere que não seja um espaço em branco e não seguido por um caractere que não seja um espaço em branco.
Isso é mais puro (IMO) do que a abordagem "espaço ou âncora" e não pressupõe que a sequência inicie e termine com caracteres de palavra, como a
\b
abordagem.fonte
\b
corresponde aos limites das palavras (sem corresponder a nenhum caractere), portanto, faça o que você deseja:fonte
mystr = r'\bstack overflow\b'