Класс символов POSIX не работает в базовом регулярном выражении R

У меня возникли проблемы с сопоставлением шаблона со строкой текста в R.

Я пытаюсь получить TRUE с помощью grepl, когда текст похож на "lettersornumbersorspaces y lettersornumbersorspaces".

Я использую следующие regex:

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

При использовании regex следующим образом для получения «адреса» он работает с ожидаемой скоростью.

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

Я вижу, что адрес - это текст, который мне нужен. Теперь, если я хочу использовать grepl для получения TRUE следующим образом:

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

FALSE возвращается. Как это возможно? Я использую тот же regex, чтобы получить TRUE. Я пробовал модифицировать параметры grepl, но ни один из них не связан с этим.

Пример текста: "26 de Marzo y Pareyra de la Luz"

Спасибо!!


person M.Pico    schedule 02.02.2017    source источник
comment
Классы символов POSIX должны быть заключены в квадратные скобки. [:alnum:] -> [[:alnum:]]. Кроме того, вы, кажется, хотите использовать шаблон PCRE с grepl, добавьте perl=TRUE.   -  person Wiktor Stribiżew    schedule 03.02.2017
comment
Это сработало! Спасибо!! знак равно   -  person M.Pico    schedule 03.02.2017


Ответы (1)


Хотя механизмы регулярных выражений stringr ICU поддерживают простые классы символов POSIX в шаблоне, в базовых вариантах регулярных выражений R (как PCRE (perl=TRUE), так и TRE) классы символов POSIX должны быть заключены в квадратные скобки. [: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

См. демонстрацию в Интернете.

Когда вы используете только [:alnum:], это просто выражение в квадратных скобках, которое соответствует одному символу, :, a, l, n, u, m.

Сведения о шаблоне:

  • [[:alnum:][:blank:]]+ - 1+ буквенно-цифровых или горизонтальных пробельных символов
  • [[:blank:]] - 1 горизонтальный пробельный символ
  • [yY] - либо y, либо Y
  • [[:blank:]] - 1 горизонтальный пробельный символ
  • [[:alnum:][:blank:]]+ - 1+ буквенно-цифровых или горизонтальных пробельных символов
person Wiktor Stribiżew    schedule 02.02.2017