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.


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)


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']

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'

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?


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.