¿Cómo debo escribir una expresión regular para que coincida con una palabra específica?

21

He estado tratando de hacer que una expresión regular específica funcione, pero no puedo hacer que haga lo que necesito.

Básicamente, quiero que busque ROCKET. La expresión regular debe coincidir con ROCKET en mayúsculas o minúsculas, con o sin puntuación, pero no cuando forma parte de otra palabra. Entonces, la expresión regular se dispararía en cualquiera de estos:

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

pero NO se dispara en ROCKET cuando se encuentra en algo como

Rocketeer
Sprocket

He estado tratando de hacerlo bien usando un generador de expresiones regulares en línea, pero no puedo hacer que coincida exactamente.

Kefka
fuente
1
Esta es una de esas situaciones [poco frecuentes] donde la pregunta podría ser más adecuada para Stack Overflow. Asegúrese de proporcionar un idioma y / o plataforma, ya que cada idioma tiene sus propias peculiaridades. Por ejemplo, Windows. .Net y la clase Regex . (Por lo general, es al revés. Stack Overflow recibe cientos de preguntas fuera de tema de los desarrolladores que son más adecuadas para Super User).
jww

Respuestas:

14

Sugiero marcar la referencia rápida de expresión regular de MSDN

desea lograr una coincidencia entre mayúsculas y minúsculas para la palabra "cohete" rodeada de caracteres no alfanuméricos. Una expresión regular que funcionaría sería:

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

Lo que hará es buscar cero o más (*) caracteres no alfanuméricos (\ W), seguidos de una versión de cohete que no distinga entre mayúsculas y minúsculas ((? I) rocket (? - i)), seguido de nuevo por cero o más ( *) caracteres no alfanuméricos (\ W). Los paréntesis adicionales alrededor del término de coincidencia de cohetes asignan la coincidencia a un grupo separado. La palabra cohete estará así en el grupo de partido 1.

ACTUALIZACIÓN 1: Matt dijo en el comentario que esta expresión regular se utilizará en Python. Python tiene una sintaxis ligeramente diferente. Para lograr el mismo resultado en python, use esta expresión regular y pase la re.IGNORECASEopción a la función compileo match.

\W*(rocket)\W*

En Regex101 esto se puede simular ingresando "i" en el cuadro de texto junto a la entrada de expresiones regulares.

ACTUALIZACIÓN 2 Ismael ha mencionado que la expresión regular no es del todo correcta, ya que podría coincidir con "1rocket1". Publicó una solución mucho mejor, a saber

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

Xaser
fuente
1
Probar esto con los probadores de expresiones regulares en línea ( regex101.com, por ejemplo) muestra que no es válido y no coincide con las cadenas de ejemplo que ingresé . Esto está destinado a ser utilizado como parte de un script de Python. ¿Eso hace alguna diferencia en cómo debe escribirse?
Kefka
1
si lo hace puedes ver en regex101.com que puedes elegir un "sabor" regex en la parte superior izquierda, python es ligeramente diferente. Actualizaré mi respuesta con el equivalente de Python.
Xaser
1
Gracias. Pensé que las expresiones regulares eran básicamente independientes del idioma.
Kefka
1
Deberían serlo, pero existen pequeñas diferencias de implementación.
Xaser
2
Y \W*(rocket)\W*fósforos lrocketl. Debería ser (?:^|\W)(rocket)(?:$|\W)(sin el *y debe verificar si coincide con el inicio y / o el final de la cadena).
Ismael Miguel
10

Creo que los look-aheads son excesivos en este caso, y sería mejor usar límites de palabras con la ignorecaseopción,

\brocket\b

En otras palabras, 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']
beroe
fuente
técnicamente, los grupos que no capturan no son miradas, sin embargo, la opción / b produce exactamente el mismo resultado que la solución de Ismael, pero puede ser un poco más elegante.
Xaser
1

Con grepy sed, puedes usar \<rocket\>. Con grepla -iopción hará que sea más sensible a las mayúsculas ( i gnore caso):

grep -i '\<rocket\>'

No conozco ninguna forma de hacer que todas las sedexpresiones regulares no distingan entre mayúsculas y minúsculas, pero siempre existe la forma del hombre de las cavernas:

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

Use la opción Buscar solo palabras completas.

En cuanto a los signos de puntuación, no puede responder hasta que sepa el sabor / sabor.

Es un hilo muy antiguo, publicado para alguien que podría visitar con una necesidad, más adelante. Los que originaron el hilo podrían haberse mudado a otra cosa ... ¿No?

Rex Schweiss
fuente
¿Qué está whole words only optionusando grepo php? Lo sentimos, pero su respuesta no ofrece ningún valor agregado en comparación con otras respuestas.
Toto el