Imaginez que vous essayez de faire correspondre le modèle "stackoverflow".
Vous voulez ce qui suit:
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]
Je sais comment analyser stackoverflow s'il a des espaces sur les deux sites en utilisant:
/\s(stackoverflow)\s/
Idem avec si c'est au début ou à la fin d'une chaîne:
/^(stackoverflow)\s/
/\s(stackoverflow)$/
Mais comment spécifier «espace ou fin de chaîne» et «espace ou début de chaîne» en utilisant une expression régulière?
regex
preg-match
anonyme
la source
la source
\b
est une assertion de largeur nulle; il ne consomme jamais de caractères. Il n'est pas nécessaire de l'envelopper dans un lookaround.\b
est ASCII standard uniquement , c'est - à - dire, pas de support unicode. Si vous avez besoin de faire correspondre des mots Unicode, vous n'avez pas d'autre choix que de l'utiliser à la place: stackoverflow.com/a/6713327/1329367(?:^|\s)
(?<=\s|^)
par(?:(?<=\s)|(?<=^))
. Sinon, vous obtenezerror: look-behind requires fixed-width pattern
\b
considérerait d'autres caractères - tels que ".
" comme des séparateurs de mots, alors que le demandeur a spécifiquement dit "espace". La solution de @ gordy semble meilleure.(^|\s)
correspondrait à l'espace ou au début de la chaîne et($|\s)
à l'espace ou à la fin de la chaîne. Ensemble c'est:la source
$1string$2
.$
et^
dans une classe de personnages, mais cela montre qu'ils peuvent simplement être placés dans un groupe de motifs régulier.Voici ce que j'utiliserais:
En d'autres termes, correspond à "stackoverflow" s'il n'est pas précédé d'un caractère non-espace et non suivi d'un caractère non-espace.
C'est plus net (IMO) que l'approche "espace ou ancre", et cela ne suppose pas que la chaîne commence et se termine par des caractères de mot comme le fait l'
\b
approche.la source
\b
correspond aux limites des mots (sans réellement correspondre à aucun caractère), donc ce qui suit devrait faire ce que vous voulez:la source
mystr = r'\bstack overflow\b'