Suche…


Einführung

Reguläre Ausdrücke (auch "Regex" oder "Regexp" genannt) definieren Muster, die mit einer Zeichenfolge abgeglichen werden können. Geben Sie ?regex für die offizielle R-Dokumentation ein. Weitere Informationen finden Sie in den Regex- Dokumenten. Der wichtigste ‚Gotcha‘ , die nicht in den SO regex / Themen gelernt wird, ist , dass die meisten R-regex Funktionen die Verwendung von gepaarten Schrägstrichen müssen in einem entkommen pattern - Parametern.

Bemerkungen

Charakterklassen

  • "[AB]" könnte A oder B sein
  • "[[:alpha:]]" könnte ein beliebiger Buchstabe sein
  • "[[:lower:]]" steht für Kleinbuchstaben. Beachten Sie, dass "[az]" nahe ist, aber nicht übereinstimmt, z. B. ú .
  • "[[:upper:]]" steht für Großbuchstaben. Beachten Sie, dass "[AZ]" nahe ist, aber nicht übereinstimmt, z. B. Ú .
  • "[[:digit:]]" steht für eine beliebige Ziffer: 0, 1, 2, ... oder 9 und entspricht "[0-9]" .

Quantifizierer

+ , * und ? gelten wie üblich in Regex. - + stimmt mindestens einmal überein, * entspricht 0 oder mehrmals und ? entspricht 0 oder 1 Mal.

Anfangs- und Endzeilenindikatoren

Sie können die Position des Regex in der Zeichenfolge angeben:

  • "^..." zwingt den regulären Ausdruck am Anfang der Zeichenfolge
  • "...$" zwingt den regulären Ausdruck am Ende der Zeichenfolge

Unterschiede zu anderen Sprachen

Bitte beachten Sie, dass reguläre Ausdrücke in R sucht oft immer so leicht von regulären Ausdrücken in anderen Sprachen verwendet.

  • R erfordert doppelte Backslash-Escape-Zeichen (da "\" bereits generell in R-Strings ein Escape-Zeichen enthält). Um beispielsweise Leerzeichen in den meisten regulären Ausdrucks-Engines zu erfassen, müssen Sie einfach \s , vs. \\s in R eingeben .

  • UTF-8-Zeichen in R sollten mit einem Großbuchstaben U gekennzeichnet werden, z. B. [\U{1F600}] und [\U1F600] stimmen mit whereas überein, wohingegen in Ruby dies mit einem Kleinbuchstaben von u übereinstimmen würde.

Zusätzliche Ressourcen

Die folgende Seite reg101 ist ein guter Ort, um Online-Regex vor der Verwendung des R-Skripts zu überprüfen.

Das R-Programmming-Wikibook enthält eine Seite für die Textverarbeitung mit vielen Beispielen mit regulären Ausdrücken.

Whitespace beseitigen

string <- '    some text on line one; 
and then some text on line two     '

Leerzeichen trimmen

"Trimmen" Whitespace bezieht sich normalerweise auf das Entfernen von sowohl führenden als auch nachlaufenden Whitespaces aus einer Zeichenfolge. Dies kann unter Verwendung einer Kombination der vorherigen Beispiele erfolgen. gsub wird verwendet, um den Ersatz sowohl für das führende als auch für das gsub zu erzwingen.

Vor R 3.2.0

gsub(pattern = "(^ +| +$)",
     replacement = "",
     x = string)

[1] "some text on line one; \nand then some text on line two"

R 3.2.0 und höher

trimws(x = string)

[1] "some text on line one; \nand then some text on line two"

Führenden Whitespace entfernen

Vor R 3.2.0

sub(pattern = "^ +", 
    replacement = "",
    x = string)

[1] "some text on line one; \nand then some text on line two     "

R 3.2.0 und höher

trimws(x = string,
       which = "left")

[1] "some text on line one; \nand then some text on line two     "

Nachlaufende Whitespace entfernen

Vor R 3.2.0

sub(pattern = " +$",
    replacement = "",
    x = string)

[1] "    some text on line one; \nand then some text on line two"

R 3.2.0 und höher

trimws(x = string,
       which = "right")

[1] "    some text on line one; \nand then some text on line two"

Alle Leerzeichen entfernen

gsub(pattern = "\\s",   
     replacement = "",
     x = string)

[1] "sometextonlineone;andthensometextonlinetwo"

Beachten Sie, dass dadurch auch Leerzeichen wie Tabulatoren ( \t ), Zeilenumbrüche ( \r und \n ) und Leerzeichen entfernt werden.

Bestätigen Sie ein Datum im Format "JJJJMMTT"

Es ist eine übliche Praxis, Namen von Dateien mit dem Datum als Präfix in folgendem Format: YYYYMMDD , zum Beispiel: 20170101_results.csv . Ein Datum in einem solchen Zeichenfolgenformat kann mit dem folgenden regulären Ausdruck überprüft werden:

\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])

Der obige Ausdruck berücksichtigt Datumsangaben aus dem Jahr : 0000-9999 , Monate zwischen: 01-12 und den Tagen 01-31 .

Zum Beispiel:

> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20170101")
[1] TRUE
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20171206")
[1] TRUE
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "29991231")
[1] TRUE

Hinweis : Es validiert die Datumssyntax, aber wir können ein falsches Datum mit einer gültigen Syntax haben, zum Beispiel: 20170229 (2017 ist kein Schaltjahr).

> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20170229")
[1] TRUE

Wenn Sie ein Datum validieren möchten, kann dies über diese benutzerdefinierte Funktion erfolgen:

is.Date <- function(x) {return(!is.na(as.Date(as.character(x), format = '%Y%m%d')))}

Dann

> is.Date(c("20170229", "20170101", 20170101))
[1] FALSE  TRUE  TRUE

Validieren Sie die Postabkürzungen der US-Bundesstaaten

Der folgende regex umfasst 50 Staaten und auch Commonwealth / Territory (siehe www.50states.com ):

regex <- "(A[LKSZR])|(C[AOT])|(D[EC])|(F[ML])|(G[AU])|(HI)|(I[DLNA])|(K[SY])|(LA)|(M[EHDAINSOT])|(N[EVHJMYCD])|(MP)|(O[HKR])|(P[WAR])|(RI)|(S[CD])|(T[NX])|(UT)|(V[TIA])|(W[AVIY])"

Zum Beispiel:

> test <- c("AL", "AZ", "AR", "AJ", "AS", "DC", "FM", "GU","PW", "FL", "AJ", "AP")
> grepl(us.states.pattern, test)
 [1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
> 

Hinweis :

Wenn Sie nur die 50 state.abb überprüfen möchten, empfehlen wir die Verwendung des R-Datensatzes: state.abb aus dem state .

> data(state)
> test %in% state.abb
[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE    

Wir erhalten TRUE nur für Abkürzungen von 50 Staaten: AL, AZ, AR, FL .

Bestätigen Sie die US-Telefonnummern

Der folgende reguläre Ausdruck:

us.phones.regex <- "^\\s*(\\+\\s*1(-?|\\s+))*[0-9]{3}\\s*-?\\s*[0-9]{3}\\s*-?\\s*[0-9]{4}$" 

Dieser Test prüft eine Telefonnummer in Form von: +1-xxx-xxx-xxxx , einschließlich optionalen führenden / Leerzeichen am Anfang / Ende jeder Gruppe von Zahlen, aber nicht in der Mitte, zum Beispiel Hinter: +1-xxx-xxx-xx xx ist nicht gültig. Die - Begrenzer kann durch Leerzeichen ersetzt werden: xxx xxx xxx oder ohne Trennzeichen: xxxxxxxxxx . Das +1 Präfix ist optional.

Lass es uns überprüfen:

us.phones.regex <- "^\\s*(\\+\\s*1(-?|\\s+))*[0-9]{3}\\s*-?\\s*[0-9]{3}\\s*-?\\s*[0-9]{4}$"

phones.OK <- c("305-123-4567", "305 123 4567", "+1-786-123-4567", 
    "+1 786 123 4567", "7861234567", "786 - 123   4567", "+ 1 786 - 123   4567")

phones.NOK <- c("124-456-78901", "124-456-789", "124-456-78 90", 
    "124-45 6-7890", "12 4-456-7890")

Gültige Fälle:

> grepl(us.phones.regex, phones.OK)
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> 

Ungültige Fälle:

 > grepl(us.phones.regex, phones.NOK)
[1] FALSE FALSE FALSE FALSE FALSE
> 

Hinweis :

  • \\s Entspricht ein beliebiges Leerzeichen, Tabulatoren oder Zeilenende- Zeichen

Escape-Zeichen in Regex-Mustern

Da sowohl R als auch Regex das gsub "\" , müssen beim gsub korrekter Muster für grep , sub , gsub oder einer anderen Funktion, die ein gsub akzeptiert, häufig Backslashes gsub . Wenn Sie einen Zeichenvektor mit drei Elementen erstellen, in dem ein Element einen Zeilenvorschub, ein anderes ein Tabulatorzeichen und kein Zeichen hat, und der Wunsch besteht, entweder den Zeilenvorschub oder den Tabulator in 4 Leerzeichen umzuwandeln, ist ein einzelner Backslash für die Konstruktion erforderlich aber paarweise Backslashes für das Matching:

x <- c( "a\nb", "c\td", "e    f")
x  # how it's stored
   #  [1] "a\nb"   "c\td"   "e    f"
cat(x)   # how it will be seen with cat
#a
#b c    d e    f

gsub(patt="\\n|\\t", repl="    ", x)
#[1] "a    b" "c    d" "e    f"

Beachten Sie, dass das Musterargument (das optional ist, wenn es zuerst erscheint und nur eine teilweise Schreibweise benötigt) das einzige Argument ist, das diese Verdoppelung oder Paarung erfordert. Das Ersetzungsargument erfordert nicht die Verdoppelung von Zeichen, für die eine Escape-Aktion erforderlich ist. Wenn Sie möchten, dass alle Zeilenvorschübe und Vorkommen mit vier Leerzeichen durch Tabulatoren ersetzt werden, wäre dies:

gsub("\\n|    ", "\t", x)
#[1] "a\tb" "c\td" "e\tf"

Unterschiede zwischen Perl- und POSIX-Regex

In R gibt es zwei sehr unterschiedliche Engines für reguläre Ausdrücke. Die Standardeinstellung ist POSIX-konsistent. Alle Regex-Funktionen in R verfügen auch über eine Option zum Aktivieren des letzteren Typs: perl = TRUE .

Vorausschau / Rückblick

perl = TRUE ermöglicht Vorausschau und Rückblick in regulären Ausdrücken.

  • "(?<=A)B" entspricht einem Auftritt des Briefes B nur dann , wenn es durch vorangestellt ist A , das heißt "ABACADABRA" würde angepasst werden, aber "abacadabra" und "aBacadabra" würde nicht.


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow