120 votes

Les expressions régulières du module re prennent-elles en charge les limites de mots ( \b ) ?

Alors que j'essayais d'en apprendre un peu plus sur les expressions régulières, un tutoriel m'a suggéré d'utiliser la fonction \b pour correspondre à une limite de mot. Cependant, l'extrait suivant dans l'interpréteur Python ne fonctionne pas comme prévu :

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

Il aurait dû être un objet de correspondance si quelque chose a été mis en correspondance, mais il est None .

Est-ce que le \b n'est pas supportée en Python ou est-ce que je l'utilise mal ?

106voto

pyfunc Points 31088

Vous devrait utiliser des chaînes brutes dans votre code

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

Aussi, pourquoi n'essayez-vous pas

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

Sortie :

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

103voto

Bolo Points 5671

Ça va marcher : re.search(r"\btwo\b", x)

Lorsque vous écrivez "\b" en Python, il s'agit d'un seul caractère : "\x08" . Soit vous échappez le backslash comme ceci :

"\\b"

ou écrire une chaîne brute comme ceci :

r"\b"

22voto

Bill the Lizard Points 147311

Pour expliquer explicitement pourquoi re.search("\btwo\b", x) ne fonctionne pas, c'est parce que \b dans une chaîne Python est un raccourci pour le caractère de retour en arrière.

print("foo\bbar")
fobar

Donc le modèle "\btwo\b" cherche un retour arrière, suivi de two suivi d'un autre retour arrière, dans lequel la chaîne que vous recherchez ( x = 'one two three' ) n'a pas.

Pour permettre re.search (ou compile ) pour interpréter la séquence \b comme limite de mot, soit vous échappez les barres obliques inversées ( "\\btwo\\b" ) ou utiliser une chaîne brute pour créer votre motif ( r"\btwo\b" ).

10voto

Ciro Santilli Points 3341

Documentation Python

https://docs.python.org/2/library/re.html#regular-expression-syntax

\b

Correspond à la chaîne vide, mais uniquement au début ou à la fin d'un mot. Un mot est défini comme une séquence de caractères alphanumériques ou de caractères de soulignement, de sorte que la fin d'un mot est indiquée par un espace ou un caractère non alphanumérique et non de soulignement. Notez que formellement, \b est définie comme la frontière entre une \w et un \W (ou vice versa), ou entre le caractère \w et le début/la fin de la chaîne, de sorte que le jeu précis de caractères considérés comme alphanumériques dépend des valeurs des drapeaux UNICODE et LOCALE. Par exemple, r' \bfoo\b correspond à 'foo', 'foo.', '(foo)', 'bar foo baz' mais pas à 'foobar' ou 'foo3'. À l'intérieur d'une plage de caractères, \b représente le caractère de retour arrière, pour des raisons de compatibilité avec les chaînes de caractères de Python.

1voto

tchrist Points 47116

Les gens sont souvent confus à propos de \b .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X