Wie soll ich einen regulären Ausdruck schreiben, der zu einem bestimmten Wort passt?

21

Ich habe versucht, einen bestimmten regulären Ausdruck zum Laufen zu bringen, aber ich kann ihn nicht dazu bringen, das zu tun, was ich brauche.

Grundsätzlich möchte ich, dass es nach ROCKET sucht. Die Regex sollte in Groß- oder Kleinschreibung und mit oder ohne Interpunktion mit ROCKET übereinstimmen, jedoch nicht, wenn sie Teil eines anderen Wortes ist. Der reguläre Ausdruck würde also Folgendes auslösen:

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

aber NICHT auf ROCKET auslösen, wenn es in so etwas wie gefunden wird

Rocketeer
Sprocket

Ich habe versucht, es mit einem Regex-Generator online richtig zu machen, aber ich kann es nicht genau zusammenbringen.

Kefka
quelle
1
Dies ist eine dieser [seltenen] Situationen, in denen die Frage möglicherweise besser für den Stapelüberlauf geeignet ist. Stellen Sie sicher, dass Sie eine Sprache und / oder Plattform bereitstellen, da jede Sprache ihre eigenen Besonderheiten aufweist. Zum Beispiel Windows. .Net und die Regex-Klasse . (Normalerweise ist es umgekehrt. Beim Stapelüberlauf werden Hunderte von Fragen von Entwicklern gestellt, die besser für Superuser geeignet sind.)
JWW

Antworten:

13

Ich empfehle, die MSDN-Kurzreferenz für reguläre Ausdrücke mit einem Lesezeichen zu versehen

Sie möchten eine Übereinstimmung zwischen Groß- und Kleinschreibung für das Wort "Rakete" erzielen, das von nicht alphanumerischen Zeichen umgeben ist. Ein Regex, der funktionieren würde, wäre:

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

Es wird nach null oder mehr (*) nicht alphanumerischen (\ W) Zeichen gesucht, gefolgt von einer Version der Rakete ((? I) Rakete (? - i)), bei der die Groß- und Kleinschreibung nicht berücksichtigt wird, gefolgt von null oder mehr (*) *) nicht alphanumerische Zeichen (\ W). Die zusätzlichen Klammern um den Raketenanpassungsbegriff weisen die Übereinstimmung einer separaten Gruppe zu. Das Wort Rakete wird somit in Spielgruppe 1 sein.

UPDATE 1: Matt sagte in dem Kommentar, dass dieser reguläre Ausdruck in Python verwendet werden soll. Python hat eine etwas andere Syntax. Um dasselbe Ergebnis in Python zu erzielen, verwenden Sie diesen regulären Ausdruck und übergeben Sie die re.IGNORECASEOption an die Funktion compileoder match.

\W*(rocket)\W*

Auf Regex101 kann dies simuliert werden, indem "i" in das Textfeld neben der Regex-Eingabe eingegeben wird.

UPDATE 2 Ismael hat erwähnt, dass der reguläre Ausdruck nicht ganz korrekt ist, da er möglicherweise mit "1rocket1" übereinstimmt. Er hat nämlich eine viel bessere Lösung veröffentlicht

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

Xaser
quelle
1
Wenn Sie dies mit Regex-Testern online testen ( z. B. regex101.com ), wird dies als ungültig angezeigt und stimmt nicht mit den von mir eingegebenen Beispielzeichenfolgen überein . Dies soll als Teil eines Python-Skripts verwendet werden. Macht das einen Unterschied, wie es geschrieben werden soll?
Kefka
1
ja tut es. Sie können auf regex101.com sehen, dass Sie oben links einen Regex- "Geschmack" auswählen können. Python ist etwas anders. Ich werde meine Antwort mit dem Python-Äquivalent aktualisieren.
Xaser
1
Vielen Dank. Ich dachte, Regexe wären grundsätzlich sprachunabhängig.
Kefka
1
Sie sollten es sein, aber es gibt geringfügige Implementierungsunterschiede.
Xaser
2
Und \W*(rocket)\W*Streichhölzer lrocketl. Es sollte sein (?:^|\W)(rocket)(?:$|\W)(ohne das *und Sie müssen prüfen, ob es mit dem Anfang und / oder Ende der Zeichenfolge übereinstimmt).
Ismael Miguel
10

Ich denke, die Vorausschau ist in diesem Fall übertrieben, und Sie sollten besser Wortgrenzen mit der ignorecaseOption verwenden.

\brocket\b

Mit anderen Worten, in 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
quelle
Technisch gesehen sind nicht erfassende Gruppen keine Lookarounds. Die Option / b liefert jedoch genau das gleiche Ergebnis wie die Lösung von Ismael, ist jedoch möglicherweise etwas eleganter.
Xaser
1

Mit grepund sedkönnen Sie verwenden \<rocket\>. Mit grepder -iwird Option macht es Groß- und Kleinschreibung ( i gnorieren Fall):

grep -i '\<rocket\>'

Ich kenne keine Möglichkeit, alle sedregulären Ausdrücke von Groß- und Kleinschreibung zu unterscheiden, aber es gibt immer den Höhlenmenschen-Weg:

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

Verwenden Sie die Option Nur nach ganzen Wörtern suchen.

Was Interpunktionen betrifft, können Sie diese erst beantworten, wenn Sie den Geschmack / das Aroma kennen.

Es ist ein sehr alter Thread, der für jemanden veröffentlicht wurde, der ihn später mit einem Bedarf besuchen könnte. Diejenigen, die den Thread erstellt haben, sind möglicherweise zu etwas anderem übergegangen ... Nein?

Rex Schweiss
quelle
Was whole words only optionbenutzt grepoder php? Entschuldigung, aber Ihre Antwort bietet im Vergleich zu anderen Antworten keinen Mehrwert.
Toto