Comment utiliser une regex dans une compréhension de liste en Python?
Je suis en train de rechercher toutes les positions d'index d'une chaîne dans une liste de mots et je veux les valeurs renvoyées sous forme de liste. Je voudrais trouver la chaîne si elle est sur son propre, ou si elle est précédée ou suivie de la ponctuation, mais pas si c'est une sous-chaîne d'un mot.
Le code suivant ne saisit "vache", et manque à la fois "test;la vache" et "la vache."
myList = ['test;cow', 'one', 'two', 'three', 'cow.', 'cow', 'acow']
myString = 'cow'
indices = [i for i, x in enumerate(myList) if x == myString]
print indices
>> 5
J'ai essayé de changer le code pour utiliser une expression régulière:
import re
myList = ['test;cow', 'one', 'two', 'three', 'cow.', 'cow', 'acow']
myString = 'cow'
indices = [i for i, x in enumerate(myList) if x == re.match('\W*myString\W*', myList)]
print indices
Mais cela donne une erreur: les attentes de la chaîne ou de la mémoire tampon
Si quelqu'un sait ce que je fais mal, je serais très heureux de les entendre. J'ai le sentiment que c'est quelque chose à voir avec le fait que je suis en train d'utiliser une expression régulière dans les il y quand il attend une chaîne de caractères. Est-il une solution?
La sortie, je suis à la recherche devrait se lire:
>> [0, 4, 5]
Grâce
OriginalL'auteur Adam | 2013-02-11
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin d'affecter le résultat de
match
retour àx
. Et votre correspondance devrait être surx
plutôt quelist
.Aussi, vous devez utiliser
re.search
au lieu dere.match
, depuis votre l'expression régulière pattern'\W*myString\W*'
ne correspond pas au premier élément. C'est parce quetest;
n'est pas compensée par\W*
. En fait, vous avez seulement besoin de tester immédiatement suivant et précédent caractère, et non pas l'intégralité de la chaîne.Ainsi, vous pouvez plutôt utiliser
word boundaries
autour de la chaîne:OriginalL'auteur Rohit Jain
Il y a quelques problèmes avec votre code. Tout d'abord, vous avez besoin pour correspondre à l'expr contre l'élément de la liste (
x
), pas par rapport à l'ensemble de la liste (myList
). En Second lieu, afin d'insérer une variable dans une expression, vous devez utiliser+
(concaténation de chaîne). Et enfin, utiliser des littéraux (r'\W
) pour correctement interpet des barres obliques dans l'expr:Si il y a des chances que myString contient des regexp caractères (comme une barre oblique ou un point), vous aurez également besoin d'appliquer
re.escape
:Comme l'a souligné dans les commentaires, la suite pourrait être une meilleure option:
re.escape
trop?bien sûr, ajouté.
Cela ne correspond pas au premier élément, qui OP voulez faire correspondre.
Un autre problème est que la regex n'est pas réellement fournir à la sortie de l'OP attend (il ne correspond pas à
test;cow
, par exemple). Je pense quere.search(r'\b' + myString + r'\b', x)
pourrait fonctionner.Merci pour cette. J'ai eu des soucis avec la r'\b*' qui était de retourner le message d'erreur "rien à redire", comme indiqué dans le commentaire ci-dessus.
OriginalL'auteur georg