2014-07-15 10 views
1

Pourquoi la limite de mot ne fonctionne-t-elle pas?Limites de mots Python Regex ne fonctionnant pas comme prévu

lecture this site, je connais des œuvres limite de mot comme celui-ci:

Il y a trois positions différentes qui se qualifient comme des limites de mots:

  • Avant le premier caractère de la chaîne, si le premier caractère est un caractère de mot.
  • Après le dernier caractère de la chaîne, si le dernier caractère est un caractère de mot.
  • Entre deux caractères dans la chaîne, où l'un est un caractère de mot et l'autre n'est pas un caractère de mot.

La chaîne a ci-dessous semble correspondre à au moins l'une des positions énumérées ci-dessus.

a = 'Builders Club The Ohio State' 
re.sub('\bThe\b', '', a, flags=re.IGNORECASE) 

sortie. Il n'y a pas de changement dans le 'The'.

'Builders Club The Ohio State' 

Pourquoi la limite de mot ne fonctionne-t-elle pas?

Lorsque je place des espaces avant et après le motif 'The', l'expression rationnelle semble fonctionner.

a = 'Builders Club The Ohio State' 
re.sub(' The ', ' ', a, flags=re.IGNORECASE) 

sortie:

'Builders Club Ohio State' 

Répondre

7

Vous devez utiliser un raw-string pour votre modèle de Regex (qui ne traite pas des séquences d'échappement):

>>> import re 
>>> a = 'Builders Club The Ohio State' 
>>> re.sub(r'\bThe\b', '', a, flags=re.IGNORECASE) 
'Builders Club Ohio State' 
>>> 

Sinon, \b sera interprété comme caractère de retour arrière:

>>> print('x\by') 
y 
>>> print(r'x\by') 
x\by 
>>> 
+1

Elaborer: La barre oblique inverse est un caractère d'échappement dans les chaînes normales et donc '\ b' devient juste [une caractère de retour arrière] (https://docs.python.org/2.0/ref/strings.html). Donc, soit vous devez utiliser '\\ b' ou un littéral de chaîne brute. – Joey

+0

Généralement, lorsque vous utilisez regex, il est conseillé d'utiliser une chaîne brute. – RevanProdigalKnight

+0

ah ic. si j'utilise r "cela gâchera-t-il d'autres caractères, comme^et $? – user3314418

1

Essayez celui

import re 
p = re.compile(ur'\bThe\b', re.IGNORECASE) 
test_str = u"Builders Club The Ohio State" 
subst = u"" 

result = re.sub(p, subst, test_str) 

sortie:

Builders Club Ohio State 

Voici DEMO

Questions connexes