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

Wie soll ich einen Regex schreiben, der einem bestimmten Wort entspricht?

Ich habe versucht, einen bestimmten Regex zum Funktionieren zu bringen, aber ich bekomme ihn nicht dazu, das zu tun, was ich brauche.

Im Grunde möchte ich, dass er nach ROCKET sucht. Das Regex sollte mit ROCKET in Groß- oder Kleinbuchstaben und mit oder ohne Interpunktion übereinstimmen, aber nicht, wenn es Teil eines anderen Wortes ist. Der Regex würde also bei einem der folgenden Wörter ausgelöst:

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

, aber NICHT bei ROCKET, wenn er in etwas wie

Rocketeer
Sprocket

gefunden wird. Ich habe versucht, es mit einem Online-Regex-Generator richtig hinzubekommen, aber ich bekomme keine exakte Übereinstimmung.

Antworten (4)

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

Ich schlage vor, ein Lesezeichen MSDN Regular Expression Quick Reference

zu setzen, um eine Groß-/Kleinschreibungsunabhängige Übereinstimmung für das Wort “Rakete”, umgeben von nicht-alphanumerischen Zeichen, zu erreichen. Ein RegEx, der funktionieren würde, wäre:

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

Was er tun wird, ist, nach null oder mehr (*) nicht-alphanumerischen (\W) Zeichen zu suchen, gefolgt von einer case-insensitiven Version von rocket ( (?i)rocket(?-i) ), wiederum gefolgt von null oder mehr (*) nicht-alphanumerischen Zeichen (\W). Die zusätzlichen Klammern um den Begriff “Rakete” weisen das Spiel einer separaten Gruppe zu. Das Wort Rakete wird also in der Spielgruppe 1 stehen.

UPDATE 1: Matt sagte im Kommentar, dass dieser Regex in Python verwendet werden soll. Python hat eine etwas andere Syntax. Um dasselbe Ergebnis in Python zu erzielen, verwenden Sie diesen Regex und übergeben die Option re.IGNORECASE an die Funktion compile oder match.

\W*(rocket)\W*

Auf Regex101 kann dies simuliert werden, indem Sie “i” in das Textfeld neben der Regex-Eingabe eingeben.

UPDATE 2 Ismael hat erwähnt, dass der Regex nicht ganz korrekt ist, da er mit “1rocket1” übereinstimmen könnte. Er postete eine viel bessere Lösung, nämlich

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

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

Ich denke, die Vorausschau ist in diesem Fall übertrieben, und es wäre besser, Wortgrenzen mit der Option ignorecase zu 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']
1
1
1
2015-04-19 04:00:42 +0000

Bei grep und sed können Sie \<rocket\>.&nbsp verwenden; Bei grep macht die Option -i die Groß-/Kleinschreibung unabhängig ( i gnore case):

grep -i '\<rocket\>'

Ich kenne keine Möglichkeit, alle sed Regexe unabhängig von der Groß-/Kleinschreibung zu machen, aber es gibt immer die Höhlenmenschen-Methode:

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

Verwenden Sie die Option Nur ganze Wörter suchen.

Was die Interpunktion betrifft, können Sie erst antworten, wenn Sie den Geschmack/Geschmack kennen.

Es handelt sich um einen sehr alten Thread, also für jemanden gepostet, der vielleicht später mit einem Bedürfnis kommt. Diejenigen, die den Thread ursprünglich geschrieben haben, sind vielleicht zu etwas anderem übergegangen… Nein?