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

8

Estou tentando fazer um regex específico funcionar, mas não consigo fazer o que preciso.

Basicamente, eu quero procurar pelo ROCKET. O regex deve corresponder ao ROCKET em maiúsculas ou minúsculas e com ou sem pontuação, mas não quando parte de outra palavra. Então, 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 é encontrado em algo como

Rocketeer
Sprocket

Estou tentando acertar usando um gerador de regex online, mas não consigo combiná-lo exatamente.

    
por Mella 18.04.2015 / 19:16

3 respostas

5

Sugiro que você marque a Referência rápida da expressão regular do MSDN

você deseja obter uma correspondência insensível a maiúsculas e minúsculas para a palavra "rocket", cercada por caracteres não alfanuméricos. Um 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 não sensível a maiúsculas e minúsculas de foguete ((i) foguete (? - i)), seguida novamente por zero ou mais (*) caracteres não alfanuméricos (\ W). Os parênteses extras ao redor do termo de correspondência de foguete atribuem a correspondência a um grupo separado. A palavra foguete estará, portanto, no grupo de correspondência 1.

UPDATE 1: Matt disse no comentário que este regex é para ser usado em python. O Python tem uma sintaxe ligeiramente diferente. Para obter o mesmo resultado em python, use essa regex e passe a opção re.IGNORECASE para a função compile ou match .

\W*(rocket)\W*

Em Regex101 , isso pode ser simulado inserindo-se "i" na caixa de texto ao lado da entrada de expressão regular.

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

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

    
por 18.04.2015 / 19:32
8

Acho que as antecipações são exageradas nesse caso, e seria melhor usar limites de palavras com a opção ignorecase

\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']
    
por 19.04.2015 / 08:17
0

Com grep e sed , você pode usar \<rocket\> . Com grep , a opção -i fará com que não diferencie maiúsculas e minúsculas (caso de gnore i ):

grep -i '\<rocket\>'

Eu não conheço nenhuma maneira de tornar todos os sed regexes insensíveis a maiúsculas e minúsculas, mas sempre tem o jeito de homem das cavernas:

sed -n '/\<[Rr][Oo][Cc][Kk][Ee][Tt]\>/p'
    
por 19.04.2015 / 06:00

Tags