R Регулярное выражение Lookhehind - PullRequest
6 голосов
/ 12 января 2012

У меня есть вектор, заполненный строками следующего формата: <year1><year2><id1><id2>

первые записи вектора выглядят так:

199719982001
199719982002
199719982003
199719982003

Для первой записи имеем: год1 = 1997, год2 = 1998, id1 = 2, id2 = 001.

Я хочу написать регулярное выражение, которое извлекает year1, id1 и цифры id2, которые не равны нулю. Таким образом, для первой записи регулярное выражение должно вывести: 199721.

Я попытался сделать это с помощью пакета stringr и создал следующее регулярное выражение:

"^\\d{4}|\\d{1}(?<=\\d{3}$)"

чтобы вытащить year1 и id1, однако при использовании lookbehind я получаю ошибку «недопустимое регулярное выражение». Это немного озадачивает меня, разве R не может справиться со взглядами и взглядами?

Ответы [ 3 ]

9 голосов
/ 12 января 2012

Вам нужно будет использовать gregexpr из пакета base. Это работает:

> s <- "199719982001"
> gregexpr("^\\d{4}|\\d{1}(?<=\\d{3}$)",s,perl=TRUE)
[[1]]
[1]  1 12
attr(,"match.length")
[1] 4 1
attr(,"useBytes")
[1] TRUE

Обратите внимание на настройку perl=TRUE. Для более подробной информации смотрите ?regex.

Судя по выводу, ваше регулярное выражение не перехватывает id1.

8 голосов
/ 12 января 2012

Так как это фиксированный формат, почему бы не использовать substr?year1 извлекается с использованием substr(s,1,4), id1 извлекается с использованием substr(s,9,9) и id2 как as.numeric(substr(s,10,13)).В последнем случае я использовал as.numeric, чтобы избавиться от нулей.

1 голос
/ 14 января 2012

Вы можете использовать sub.

sub("^(.{4}).{4}(.{1}).*([1-9]{1,3})$","\\1\\2\\3",s)
...