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.IGNORECASE
opção para a função compile
ou 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 ignorecase
opçã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 grep
e sed
, você pode usar \<rocket\>
. Com grep
, a -i
opção tornará insensível a maiúsculas e minúsculas (euignorar caso):
grep -i '\<rocket\>'
Não conheço nenhuma maneira de tornar todas sed
as 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