2017-11-30 4 views
0

ich einen Charakter Vektor haben, die X.1 enthält - X.13 (und in Wirklichkeit, darunter auch viele andere Sachen, die beiden anderen nummerierten Variablen und Variablen mit X). Ich mag X.3 lokalisieren - X.13 und in diesem Sinne habe grep mit dem folgenden Ausdruck verwendet:Identifizierung aller Zahlen über n mit grep

x <- paste0("X.", 1:13) 
grep("^X\\.[3-9]{1}|^X\\.[0-9]{2}", x) 

Meine Frage: Gibt es einen besseren, kürzeren Ausdruck, der hier verwendet werden könnte? Ich verstehe, dass das wahrscheinlich ziemlich trivial ist, aber ich möchte die Regex besser verstehen.

+2

wie etwa 'val <- as.numerisch (gsub ("^ X \\.", "", x)); was (3 <= v & v <= 13) '...? –

+4

Die immer redundante '{1}' loszuwerden wäre ein guter Anfang. – CAustin

+0

Entschuldigung, mein Vorschlag funktioniert möglicherweise nicht mit den "vielen anderen Sachen" ... –

Antwort

0

Ihr Muster enthält zwei Alternativen, ^X\\.[3-9]{1} Streichhölzer X.3 zu X.9 und ^X\\.[0-9]{2} Matches X.00-X.99. Das ist nicht was du suchst.

Um

grep("^X\\.(?:[3-9]|1[0-3])\\b", x) 

Oder nur X.3-X.13, verwenden Sie zu finden in jeder rechten Seite Kontext (kein Wortgrenze auf der rechten Seite) entsprechen:

grep("^X\\.(?:1[0-3]|[3-9])", x) 

Siehe the regex demo.

Oder, wenn ein Brief oder _ nach der Zahl sein kann, ersetzen \\b mit (?!\\d) und sicher sein, perl=TRUE an die grep Funktion zu übergeben, da die Look-Ahead-Konstrukte, die durch den Standard TRE Regex-Engine nicht unterstützt werden:

grep("^X\\.(?:[3-9]|1[0-3])(?!\\d)", x, perl=TRUE) 

Siehe this regex demo.

Ein weiterer Punkt: die ^ caret verwendet werden, um den Beginn der Zeichenfolge zu bezeichnen. Wenn Sie die Teil eine beliebige Stelle innerhalb der Zeichenfolge übereinstimmen bedeuten, entfernen oder ersetzen mit \\bX übereinstimmen, die nicht mit _, Buchstaben oder Ziffern vorangestellt ist (siehe noch another regex demo).

Einzelheiten

  • ^ - Beginn der Zeichenfolge
  • X\\. - ein X. Teilzeichenfolge
  • (?: - Beginn einer Gruppe:
    • 1[0-3] - 1 mit einer Ziffer gefolgt von 0 t o 3
    • | - oder
    • [3-9] - 3 zu 9
  • ) - Ende der Nicht-Erfassung Gruppe
  • \\b - eine Wortgrenze
Verwandte Themen