2017-02-02 1 views
1

Ich habe einige Probleme mit einem Muster mit einer Zeichenfolge in R.POSIX Zeichenklasse funktioniert nicht in der Basis R Regex

Ich versuche TRUE mit grepl zu erhalten, wenn der Text so etwas wie "lettersornumbersorspaces y lettersornumbersorspaces".

ist

Ich verwende die folgenden regex:

([:alnum:]|[:blank:])+[:blank:][yY][:blank:]([:alnum:]|[:blank:])+ 

Wenn die regex wie folgt verwendet, die „Adresse zu erhalten "Es funktioniert bei erwartet.

regex <- "([:alnum:]|[:blank:])+[:blank:][yY][:blank:]([:alnum:]|[:blank:])+" 
address <- str_extract(fulltext, regex) 

ich die Adresse sehen, ist der Text, den ich brauche. Nun, wenn ich will grepl verwenden, um eine TRUE wie folgt zu erhalten:

grepl("([:alnum:]|[:blank:])+[:blank:][yY][:blank:]([:alnum:]|[:blank:])+", address,ignore.case = TRUE) 

FALSE zurückgegeben. Wie ist das möglich? Ich verwende das gleiche regex, um TRUE zu erhalten. Ich habe Änderungen an den grepl Parametern versucht, aber keiner von ihnen ist damit verbunden.

Ein Beispiel für Text ist: "26 de Marzo y Pareyra de la Luz"

Dank !!

+0

POSIX-Zeichenklassen müssen innerhalb Klammerausdrücke sein. '[: alnum:]' -> '[[: alnum:]]]'. Sie scheinen auch ein PCRE-Muster mit 'grepl' zu verwenden, fügen Sie' perl = TRUE' hinzu. –

+0

Das hat funktioniert! Vielen Dank!! =) –

+0

Schön, dass es für dich funktioniert hat. Bitte überlegen Sie, die Antwort zu akzeptieren (siehe [So akzeptieren Sie SO-Antworten] (http: //meta.stackexchange.com/questions/5234/Wie-akzeptiert-eine-Antwort-Arbeit)). –

Antwort

2

Obwohl stringr ICU regex Motoren bare POSIX Zeichenklassen in den Musterklassen müssen Innenseite Klammerausdrücke sein, in Basis R Regex-Varianten (beide PCRE (perl=TRUE) und TRE), POSIX Zeichen unterstützt. [:alnum:] ->[[:alnum:]].

x <- c("AZaz09 y AZaz09", "ĄŻaz09 y AZŁł09", "26 de Marzo y Pareyra de la Luz") 
grepl("[[:alnum:][:blank:]]+[[:blank:]][yY][[:blank:]][[:alnum:][:blank:]]+", x) 
## => [1] TRUE TRUE TRUE 
grepl("[[:alnum:][:blank:]]+[[:blank:]][yY][[:blank:]][[:alnum:][:blank:]]+", x, perl=TRUE) 
## => [1] TRUE TRUE TRUE 

Siehe online demo

Wenn Sie [:alnum:] allein verwenden, ist es ein einfacher Klammerausdruck ist, der ein einzelnes Zeichen übereinstimmt, ein :, a, l, n, u, m.

Muster Details:

  • [[:alnum:][:blank:]]+ - 1+ alphanumerische oder horizontale Leerzeichen, Symbole
  • [[:blank:]] - 1 horizontale Leerzeichen, Symbole
  • [yY] - entweder y oder Y
  • [[:blank:]] - 1 horizontal Leerzeichen Symbole
  • [[:alnum:][:blank:]]+ - 1+ alphanumerische oder horizontale Leerzeichen, Symbole
Verwandte Themen