2015-04-18 17:16:31 +0000 2015-04-18 17:16:31 +0000
20
20

Comment dois-je écrire une regex qui correspond à un mot spécifique ?

J'ai essayé de faire fonctionner une regex spécifique mais je n'arrive pas à lui faire faire ce dont j'ai besoin.

En gros, je veux qu'il cherche ROCKET. La regex doit correspondre à ROCKET en majuscules ou en minuscules, et avec ou sans ponctuation, mais pas lorsqu'elle fait partie d'un autre mot. Ainsi, la regex se déclenchera sur n'importe lequel de ces mots :

rocket
RoCKEt
hi Rocket
This is a rocket.
ROCKET's engine

mais ne se déclenchera PAS sur ROCKET lorsqu'il sera trouvé dans quelque chose comme

Rocketeer
Sprocket

J'ai essayé de trouver la bonne réponse en utilisant un générateur de regex en ligne mais je n'arrive pas à la faire correspondre exactement.

Réponses (4)

11
11
11
2015-04-18 17:32:40 +0000

Je vous suggère de mettre en signet le MSDN Regular Expression Quick Reference

vous voulez obtenir une correspondance insensible à la casse pour le mot “rocket” entouré de caractères non alphanumériques. Une regex qui fonctionnerait serait :

\W*((?i)rocket(?-i))\W*

Ce qu'elle fera, c'est rechercher zéro ou plus (*) caractères non alphanumériques (\W), suivi d'une version insensible à la casse du mot “rocket” (?i)rocket(?-i) ), suivi à nouveau de zéro ou plus (*) caractères non alphanumériques (\W). Les parenthèses supplémentaires autour du terme de correspondance de fusée attribuent la correspondance à un groupe séparé. Le mot “rocket” sera donc dans le groupe de correspondance 1.

MISE À JOUR 1: Matt a dit dans le commentaire que cette regex doit être utilisée en python. Python a une syntaxe légèrement différente. Pour obtenir le même résultat en python, utilisez cette regex et passez l'option re.IGNORECASE à la fonction compile ou match.

\W*(rocket)\W*

Sur Regex101 cela peut être simulé en entrant “i” dans la zone de texte à côté de l'entrée de la regex.

UPDATE 2 Ismael a mentionné, que la regex n'est pas tout à fait correcte, car elle pourrait correspondre à “1rocket1”. Il a proposé une bien meilleure solution, à savoir

(?:^|\W)rocket(?:$|\W)

10
10
10
2015-04-19 06:17:43 +0000

Je pense que les prévisions sont exagérées dans ce cas, et qu'il serait préférable d'utiliser les limites des mots avec l'option ignorecase,

\brocket\b

En d'autres termes, en python :

>>> x="rocket's"
>>> y="rocket1."
>>> c=re.compile(r"\brocket\b",re.I) # with the ignorecase option
>>> c.findall(y)
[]
>>> c.findall(x)
['rocket']
1
1
1
2015-04-19 04:00:42 +0000

Avec grep et sed, vous pouvez utiliser \<rocket\>.&nbsp ; Avec grep, l'option -i rendra la casse insensible ( i ronflement) :

grep -i '\<rocket\>'

Je ne connais aucun moyen de rendre toutes les regexes de sed insensibles à la casse, mais il y a toujours la méthode de l'homme des cavernes :

sed -n '/\<[Rr][Oo][Cc][Kk][Ee][Tt]\>/p'
0
0
0
2019-11-23 10:06:05 +0000

Utilisez l'option “Recherche de mots entiers uniquement”.

En ce qui concerne les ponctuations, vous ne pouvez pas répondre tant que vous ne connaissez pas la saveur/le goût.

C'est un très vieux fil de discussion, donc affiché pour quelqu'un qui pourrait visiter avec un besoin, plus tard. Les auteurs du fil de discussion ont peut-être changé de sujet… Non ?