Como devo escrever um regex para corresponder a uma palavra específica?

Como devo escrever um regex para corresponder a uma palavra específica?

Tenho tentado fazer com que um regex específico funcione, mas não consigo fazer o que preciso.

Basicamente, quero procurar ROCKET. A regex deve corresponder a ROCKET em letras maiúsculas ou minúsculas, e com ou sem pontuação, mas não quando fizer parte de outra palavra. Portanto, o regex seria acionado em qualquer um destes:

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

mas NÃO é acionado no ROCKET quando ele é encontrado em algo como

Rocketeer
Sprocket

Tenho tentado acertar usando um gerador de regex on-line, mas não consigo fazer com que corresponda exatamente.

Responder1

Eu sugiro marcar oReferência rápida de expressões regulares do MSDN

você deseja obter uma correspondência sem distinção entre maiúsculas e minúsculas para a palavra "foguete" cercada por caracteres não alfanuméricos. Uma regex que funcionaria seria:

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

O que ele fará é procurar zero ou mais (*) caracteres não alfanuméricos (\W), seguidos por uma versão sem distinção entre maiúsculas e minúsculas de rocket ( (?i)rocket(?-i) ), seguida novamente por zero ou mais ( *) caracteres não alfanuméricos (\W). Os parênteses extras ao redor do termo correspondência de foguetes atribuem a correspondência a um grupo separado. A palavra foguete estará, portanto, no grupo de jogo 1.

ATUALIZAÇÃO 1: Matt disse no comentário que este regex deve ser usado em python. Python tem uma sintaxe ligeiramente diferente. Para obter o mesmo resultado em python, use este regex e passe a re.IGNORECASEopção para a função compileou match.

\W*(rocket)\W*

SobreRegex101isso pode ser simulado inserindo "i" na caixa de texto próxima à entrada regex.

ATUALIZAÇÃO 2Ismael mencionou que o regex não está correto, pois pode corresponder a "1rocket1". Ele postou uma solução muito melhor, ou seja,

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

Responder2

Acho que as previsões são um exagero neste caso, e seria melhor usar limites de palavras com a ignorecaseopção,

\brocket\b

Em outras palavras, em 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']

Responder3

Com grepe sed, você pode usar \<rocket\>. Com grep, a -iopção tornará insensível a maiúsculas e minúsculas (euignorar caso):

grep -i '\<rocket\>'

Não conheço nenhuma maneira de tornar todas sedas expressões regulares insensíveis a maiúsculas e minúsculas, mas há sempre o jeito do homem das cavernas:

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

Responder4

Acho que você pode usar algo assim para especificar a palavra que deseja: /^(rocket|RoCKEt)$/g

informação relacionada