2015-04-18 17:16:31 +0000 2015-04-18 17:16:31 +0000
20
20

Come dovrei scrivere un regex che corrisponda a una parola specifica?

Ho cercato di far funzionare un regex specifico ma non riesco a fargli fare quello che mi serve.

Fondamentalmente, voglio che cerchi ROCKET. Il regex dovrebbe corrispondere a ROCKET in maiuscolo o minuscolo, e con o senza punteggiatura, ma non quando fa parte di un'altra parola. Quindi, il regex si innescherebbe su uno qualsiasi di questi:

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

ma NON si innescherebbe su ROCKET quando si trova in qualcosa come

&001

Ho cercato di farlo funzionare bene usando un generatore regex online ma non riesco a farlo corrispondere esattamente.

Risposte (4)

11
11
11
2015-04-18 17:32:40 +0000

Suggerisco di inserire nei segnalibri MSDN Regular Expression Quick Reference

si vuole ottenere una corrispondenza insensibile al caso per la parola “razzo” circondata da caratteri non alfanumerici. Un regex che funzionerebbe sarebbe:

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

Quello che farà è cercare zero o più (*) caratteri non alfanumerici (\W), seguito da una versione non sensibile alle maiuscole del razzo (“i)razzo (?-i) ), seguito di nuovo da zero o più (*) caratteri non alfanumerici (\W). La parentesi in più intorno al termine di corrispondenza razzo assegna la partita a un gruppo separato. La parola razzo sarà quindi nel gruppo match 1.

UPDATE 1: Matt ha detto nel commento che questo regex deve essere usato nel pitone. Python ha una sintassi leggermente diversa. Per ottenere lo stesso risultato in python, usare questo regex e passare l'opzione re.IGNORECASE alla funzione compile o match.

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

Su Regex101 questo può essere simulato inserendo "i” nella casella di testo accanto all'input regex.

UPDATE 2 Ismael ha detto, che il regex non è del tutto corretto, poiché potrebbe corrispondere a “1rocket1”. Ha postato una soluzione molto migliore, ovvero

&007

10
10
10
2015-04-19 06:17:43 +0000

Penso che in questo caso il look-aheads sia eccessivo, e sarebbe meglio usare i confini delle parole con l'opzione ignorecase,

\brocket\b &007

In altre parole, in pitone:

>>> x="rocket's"
>>> y="rocket1."
>>> c=re.compile(r"\brocket\b",re.I) # with the ignorecase option
>>> c.findall(y)
[]
>>> c.findall(x)
['rocket']
1
1
1
2015-04-19 04:00:42 +0000

Con grep e sed, è possibile utilizzare \<rocket\>.  Con grep, l'opzione -i lo renderà insensibile alle maiuscole e minuscole ( i gnore case):

grep -i '\<rocket\>'

Non conosco alcun modo per rendere tutti i sed regexes insensibili alle maiuscole, ma c'è sempre il modo degli uomini delle caverne:

sed -n '/\<[Rr][Oo][Cc][Kk][Ee][Tt]\>/p'
0
0
0
2019-11-23 10:06:05 +0000

Usate l'opzione Cerca solo parole intere.

Per quanto riguarda la punteggiatura, non potete rispondere finché non ne conoscete il sapore/gusto.

È un thread molto vecchio, quindi postato per qualcuno che potrebbe visitarlo con un bisogno, più tardi. Chi ha dato origine al thread potrebbe essere passato a qualcos'altro… No?