Группы захвата регулярных выражений

Я пытаюсь извлечь широты, долготы и метку из строки в R (v3.4.1). Я думал, что регулярное выражение - это путь, и, поскольку у пакета stringr есть возможность извлекать группы захвата, я подумал, что это пакет для использования. Проблема в том, что я получаю ошибку, которую не могу интерпретировать. Любая помощь будет оценена.

Вот пример строки, из которой я хотел бы извлечь информацию. Я хочу взять последний набор широты (41.505) и долготы (-81.608333) вместе с надписью (Адельберт Холл).

a <- "Case Western Reserve University campus41°30′18″N 81°36′30″W / 41.505°N 81.608333°W / 41.505; -81.608333 (Adelbert Hall)"

Вот регулярное выражение, которое я создал, чтобы захватить интересующие меня поля.

coordRegEx <- "([\\d]*\\.\\d*)(?#Capture Latitude);\\h(-\\d*\\.\\d*)(?#Capture Longitude)\\N*\\((\\N*)(?#Capture Label)\\)"

Теперь, когда я пытаюсь сопоставить регулярное выражение в строке, используя:

s <- str_match(a,coordRegEx)

Я получаю следующую ошибку:

Ошибка в stri_match_first_regex(строка, шаблон, opts_regex = opts(шаблон)): неверное свойство Unicode. (U_REGEX_PROPERTY_SYNTAX)

Я предполагаю, что эта ошибка как-то связана с шаблоном Regex, но, используя документацию и поиск в Интернете, я не смог ее расшифровать.

2 ответа

Решение

Есть несколько проблем с текущим кодом:

  • (?#:...) комментарии, которые разрешены только когда вы передаете x модификатор к регулярному выражению
  • \N Сокращенный символ, который соответствует любому символу разрыва строки, не поддерживается библиотекой регулярных выражений ICU (он поддерживает \N{UNICODE CHARACTER NAME} что соответствует названному персонажу). Вы можете заменить \N с .,

Смотрите ваш фиксированный подход:

> a <- "Case Western Reserve University campus41°30′18″N 81°36′30″W / 41.505°N 81.608333°W / 41.505; -81.608333 (Adelbert Hall)"
> coordRegEx <- "(?x)(\\d*\\.\\d*)(?#Capture Latitude);\\h(-\\d*\\.\\d*)(?#Capture Longitude).*\\((.*)(?#Capture Label)\\)"
> s <- str_match(a,coordRegEx)
> s

 [,1]                                         [,2]         [,3]            [,4]           
[1,] "41.505; -81.608333 (Adelbert Hall)" "41.505" "-81.608333" "Adelbert Hall"

Если нам нужен вывод строки

sub(".*\\/\\s*", "", a)
#[1] "41.505; -81.608333 (Adelbert Hall)"

Если нам это нужно как отдельный

strsplit(sub(".*\\/\\s*", "", a), ";\\s*|\\s*\\(|\\)")[[1]]
#[1] "41.505"        "-81.608333"    "Adelbert Hall"
Другие вопросы по тегам