web-dev-qa-db-fra.com

Comment dois-je écrire une regex pour correspondre à un mot spécifique?

J'ai essayé de faire fonctionner une regex spécifique mais je ne peux pas le faire faire ce dont j'ai besoin.

En gros, je veux que ça cherche ROCKET. La regex doit correspondre à ROCKET en majuscules ou en minuscules, avec ou sans ponctuation, mais pas dans le cas d'un autre mot. Ainsi, l'expression régulière déclencherait sur l'un de ces éléments:

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

mais PAS déclencher sur ROCKET quand il se trouve dans quelque chose comme

Rocketeer
Sprocket

J'ai essayé de bien faire les choses en utilisant un générateur de regex en ligne, mais je n'arrive pas à le faire correspondre exactement.

13
Kefka

Je suggère de mettre en favori le Référence rapide de MSDN Regular Expression

vous souhaitez obtenir une correspondance insensible à la casse pour le mot "fusée" entouré de caractères non alphanumériques. Une regex qui fonctionnerait serait:

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

Ce qu’il fera est de chercher zéro ou plus (*) caractères non alphanumériques (\ W), suivis d’une version non sensible à la casse de rocket ((? I) rocket (? - i)), suivi de zéro ou plus ( *) caractères non alphanumériques (\ W). Les parenthèses supplémentaires autour du terme correspondant à la fusée attribuent la correspondance à un groupe distinct. La fusée Word sera donc dans le groupe de match 1.

UPDATE 1: Matt a déclaré dans le commentaire que cette expression rationnelle devait ê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 expression rationnelle et transmettez 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 regex.

UPDATE 2 Ismael a mentionné que l'expression régulière n'est pas tout à fait correcte, car elle pourrait correspondre à "1rocket1". Il a posté une bien meilleure solution, à savoir

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

8
Xaser

Je pense que les anticipations sont excessives dans ce cas, et il serait préférable d'utiliser les limites de Word 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']
9
beroe

Avec grep et sed, vous pouvez utiliser \<rocket\>. Avec grep, l'option -i le rendra insensible à la casse ( i gnore case):

grep -i '\<rocket\>'

Je ne connais aucun moyen de rendre toutes les expressions rationnelles sed insensibles à la casse, mais il y a toujours le moyen de faire des hommes des cavernes:

sed -n '/\<[Rr][Oo][Cc][Kk][Ee][Tt]\>/p'
0
Scott