Come devo scrivere una regex per abbinare una parola specifica?


21

Ho cercato di far funzionare un regex specifico ma non riesco a farlo per 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 di questi:

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

ma NON si attiva su ROCKET quando si trova in qualcosa del genere

Rocketeer
Sprocket

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


1
Questa è una di quelle situazioni [poco frequenti] in cui la domanda potrebbe essere più adatta allo StackTranslate.it. Assicurati di fornire una lingua e / o una piattaforma poiché ogni lingua ha le sue peculiarità. Ad esempio, Windows. .Net e la classe Regex . (Di solito, è il contrario. Stack Overflow riceve centinaia di domande fuori tema dagli sviluppatori che sono più adatti per i Super User).
JWW

Risposte:


14

Suggerisco di aggiungere ai segnalibri il riferimento rapido per le espressioni regolari MSDN

si desidera ottenere una corrispondenza senza distinzione tra maiuscole e minuscole per la parola "razzo" circondata da caratteri non alfanumerici. Una regex che funzionerebbe sarebbe:

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

Quello che farà è cercare zero o più (*) caratteri non alfanumerici (\ W), seguiti da una versione senza distinzione tra maiuscole e minuscole del razzo ((? I) razzo (? - i)), seguito ancora da zero o più ( *) caratteri non alfanumerici (\ W). Le parentesi extra attorno al termine di corrispondenza del razzo assegnano la corrispondenza a un gruppo separato. La parola razzo sarà quindi nel gruppo di partite 1.

AGGIORNAMENTO 1: Matt ha detto nel commento che questo regex deve essere usato in Python. Python ha una sintassi leggermente diversa. Per ottenere lo stesso risultato in Python, usa questo regex e passa l' re.IGNORECASEopzione alla funzione compileo match.

\W*(rocket)\W*

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

AGGIORNAMENTO 2 Ismael ha menzionato che il regex non è del tutto corretto, poiché potrebbe corrispondere a "1rocket1". Ha pubblicato una soluzione molto migliore, vale a dire

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


1
Provando questo con i tester regex online ( regex101.com per esempio) lo mostra come stringa di esempio non valida e non corrispondente che inserisco. Questo è pensato per essere usato come parte di uno script Python. Fa qualche differenza nel modo in cui dovrebbe essere scritto?
Kefka,

1
si lo fa. puoi vedere su regex101.com che puoi scegliere un "sapore" regex in alto a sinistra, il pitone è leggermente diverso. Aggiornerò la mia risposta con l'equivalente di Python.
Xaser,

1
Grazie. Pensavo che le regex fossero sostanzialmente indipendenti dalla lingua.
Kefka,

1
Dovrebbero esserlo, ma esistono differenze di implementazione minori.
Xaser,

2
E \W*(rocket)\W*partite lrocketl. Dovrebbe essere (?:^|\W)(rocket)(?:$|\W)(senza il *e devi controllare se corrisponde all'inizio e / o alla fine della stringa).
Ismael Miguel,

10

Penso che le prospettive siano eccessive in questo caso e sarebbe meglio usare i confini delle parole con l' ignorecaseopzione,

\brocket\b

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

tecnicamente, i gruppi che non catturano non sono una soluzione, tuttavia l'opzione / b produce esattamente lo stesso risultato della soluzione di Ismael, ma può essere un po 'più elegante.
Xaser,

1

Con grepe sed, puoi usare \<rocket\>. Con grep, l' -iopzione renderà maiuscole e minuscole ( i gnore case):

grep -i '\<rocket\>'

Non conosco alcun modo per rendere tutte le sedregex insensibili alle maiuscole, ma c'è sempre la via delle caverne:

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

0

Usa l'opzione Cerca solo parole intere.

Per quanto riguarda le punteggiatura, non puoi rispondere finché non conosci il sapore / sapore.

È un thread molto vecchio, quindi pubblicato per qualcuno che potrebbe visitare con un bisogno, in seguito. Chi ha dato origine al thread potrebbe essersi spostato in qualcos'altro ... No?


Cosa sta whole words only optionusando grepo php? Siamo spiacenti, ma la tua risposta non dà alcun valore aggiunto rispetto ad altre risposte.
Tot
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.