Группы захвата регулярных выражений
Я пытаюсь извлечь широты, долготы и метку из строки в 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"