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

¿Cómo debo escribir un regex para que coincida con una palabra específica?

He estado tratando de hacer funcionar un regex específico pero no puedo conseguir que haga lo que necesito.

Básicamente, quiero que busque ROCKET. El regex debe coincidir con ROCKET en mayúsculas o minúsculas, y con o sin puntuación, pero no cuando es parte de otra palabra. Entonces, el regex se activaría en cualquiera de estos:

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

pero NO se activaría en ROCKET cuando se encuentra en algo como

Rocketeer
Sprocket

He estado tratando de hacerlo bien usando un generador de regex en línea pero no puedo conseguir que coincida exactamente.

Respuestas (4)

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

Sugiero que marque el MSDN Regular Expression Quick Reference

para lograr una coincidencia insensible a las mayúsculas y minúsculas de la palabra “cohete” rodeada de caracteres no alfanuméricos. Un regex que funcionaría sería:

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

Lo que hará es buscar cero o más (*) caracteres no alfanuméricos (\W), seguido de una versión insensible a mayúsculas y minúsculas de “rocket” (?i)rocket(?-i) ), seguido de nuevo por cero o más (*) caracteres no alfanuméricos (\W). El paréntesis extra alrededor del término de cohete-cohete asigna la coincidencia a un grupo separado. La palabra cohete estará por lo tanto en el grupo de coincidencia 1.

Actualización 1: Matt dijo en el comentario que este regex debe ser usado en pitón. La pitón tiene una sintaxis ligeramente diferente. Para lograr el mismo resultado en python, usa esta regex y pasa la opción re.IGNORECASE a la función compile o match.

\W*(rocket)\W*

En Regex101 esto puede ser simulado introduciendo “i” en la caja de texto junto a la entrada de la regex.

UPDATE 2 Ismael ha mencionado, que la regex no es del todo correcta, ya que podría coincidir con “1rocket1”. Ha publicado una solución mucho mejor, a saber

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

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

Creo que las miradas son exageradas en este caso, y sería mejor usar los límites de las palabras con la opción ignorecase,

\brocket\b

En otras palabras, en pitón:

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

Con grep y sed, puedes usar \<rocket\>.  Con grep, la opción -i lo hará insensible a las mayúsculas y minúsculas ( i gnore case):

grep -i '\<rocket\>'

No conozco ninguna manera de hacer que todas las sed regexes sean insensibles a las mayúsculas y minúsculas, pero siempre está la manera del hombre de las cavernas:

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

Usa la opción Buscar sólo palabras completas.

En cuanto a la puntuación, no puedes responder hasta que no sepas el sabor.

Es un hilo muy antiguo, así que lo envié para alguien que pueda visitarlo con una necesidad, más tarde. Aquellos que originaron el hilo podrían haberse mudado a otra cosa… ¿No?