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

21

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

Basicamente, quero que procure o 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. 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 é encontrado em algo como

Rocketeer
Sprocket

Eu tenho tentado acertar usando um gerador de regex online, mas não consigo fazer a correspondência exata.

Kefka
fonte
11
Essa é uma daquelas situações [pouco frequentes] em que a pergunta pode ser mais adequada para o estouro de pilha. Certifique-se de fornecer um idioma e / ou plataforma, pois cada idioma tem suas próprias peculiaridades. Por exemplo, Windows. .Net e a classe Regex . (Geralmente, é o contrário. O Stack Overflow recebe centenas de perguntas fora do tópico dos desenvolvedores que são mais adequadas para o Superusuário).
JWW

Respostas:

14

Sugiro que você marque a Referência Rápida de Expressão Regular 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. 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 sem distinção entre maiúsculas e minúsculas do foguete ((? I) foguete (? - i)), seguido 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 partida 1.

ATUALIZAÇÃO 1: Matt disse no comentário que esse regex deve ser usado em python. Python tem uma sintaxe um pouco 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*

No Regex101, isso pode ser simulado digitando "i" na caixa de texto ao lado da entrada do regex.

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

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

Xaser
fonte
11
Testar isso com testadores de regex online ( regex101.com, por exemplo) mostra como seqüências de exemplo inválidas e não correspondentes que eu insiro . Isso deve ser usado como parte de um script python. Isso faz alguma diferença na forma como deve ser escrito?
Kefka
11
sim. você pode ver no regex101.com que pode escolher um "sabor" de regex no canto superior esquerdo, python é um pouco diferente. Vou atualizar minha resposta com o equivalente em python.
Xaser 18/04
11
Obrigado. Eu pensei que as expressões regulares eram basicamente independentes da linguagem.
Kefka
11
Deveriam ser, mas existem pequenas diferenças de implementação.
Xaser 18/04
2
E \W*(rocket)\W*fósforos lrocketl. Deve ser (?:^|\W)(rocket)(?:$|\W)(sem o *e você deve verificar se ele corresponde ao início e / ou final da string).
Ismael Miguel
10

Acho que o futuro é um exagero nesse 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']
beroe
fonte
tecnicamente, os grupos que não capturam não são uma busca, mas a opção / b produz exatamente o mesmo resultado que a solução de Ismael, mas pode ser um pouco mais elegante.
Xaser 19/04
1

Com grepe sed, você pode usar \<rocket\>. Com grepa -iopção fará com que ele case-insensitive ( i gnore caso):

grep -i '\<rocket\>'

Não conheço nenhuma maneira de tornar todas as sedexpressões regulares sem distinção entre maiúsculas e minúsculas, mas sempre há a maneira do homem das cavernas:

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

Use a opção Pesquisar somente palavras inteiras.

No que diz respeito às pontuações, você não pode responder até conhecer o sabor / sabor.

É um tópico muito antigo, postado para alguém que possa visitar com uma necessidade posteriormente. Quem originou o segmento pode ter se mudado para outra coisa ... Não?

Rex Schweiss
fonte
O que está whole words only optionusando grepou php? Desculpe, mas sua resposta não oferece nenhum valor agregado em comparação com outras respostas.
Toto