Сопоставление последней и первой скобки в gsub/r и сохранение остального содержимого без изменений

Я работаю с вектором символов следующего формата:

[-0.2122,-0.1213)
[-0.2750,-0.2122)
[-0.1213,-0.0222)
[-0.1213,-0.0222)

Я хотел бы удалить [ и ), чтобы получить желаемый результат, похожий на:

-0.2122,-0.1213
-0.2750,-0.2122
-0.1213,-0.0222
-0.1213,-0.0222

Попытки

1 - Группы,

Я думал о захвате первой и второй группы в строках синтаксиса:

[[^\[{1}(?![[:digit:]])\){1}

но, похоже, это не работает (regex101).

2 - Пунктуация

Код: [[:punct:]] захватит все знаки препинания regex101.

Соответствие

3 - Снова группы

Затем я попытался сопоставить две группы: (\[)(\)), но опять же без недостатка regex101.


Проблему можно легко решить, дважды применив gsub или используя multigsub доступен в пакете qdap, но мне интересно решить это с помощью одного выражения, это возможно.


person Konrad    schedule 20.01.2016    source источник
comment
Почему бы просто не \[|\)? как в gsub("\\[|\\)", "", "[-0.2122,-0.1213)")? Или я что-то пропустил здесь   -  person David Arenburg    schedule 20.01.2016
comment
Почему бы и нет, ^\[|\)$ или ^[[:punct:]]|[[:punct:]]$?   -  person Avinash Raj    schedule 20.01.2016
comment
Это удаляет первый и последний символы каждого компонента v : gsub("^.|.$", "", v) . Также кажется, что они имеют фиксированную ширину, так что это сработает: read.fwf(textConnection(v), widths = c(1, 7, 1, 7, 1))[c(2, 4)]   -  person G. Grothendieck    schedule 20.01.2016
comment
Или просто gsub("[[)]","","[-0.2122,-0.1213)"), так как мы можем быть уверены, что в обработанном тексте не будет круглых или квадратных скобок из первого и последнего.   -  person Tensibai    schedule 20.01.2016
comment
Если nchar тот же, то substr(x, 2, nchar(x) - 1)   -  person zx8754    schedule 20.01.2016
comment
@DavidArenburg Да, вы правы.   -  person Konrad    schedule 20.01.2016
comment
@AvinashRaj, поскольку в тот момент мне это не пришло в голову, но решение очень хорошее.   -  person Konrad    schedule 20.01.2016
comment
@ zx8754 nchar в этом конкретном случае то же самое, но я бы предпочел иметь решение, которое не обязательно зависит от этого, поскольку в некоторых других случаях оно может быть другим.   -  person Konrad    schedule 20.01.2016
comment
Это звучит как проблема XY, я думаю, следующим шагом будет разделение двух чисел в двух столбцах DF... так что: regmatches(input(regexpr('\\[(.*),(.*)\\)',input) звучит лучше (возможно, с префиксом as.numeric... демонстрация того, что я имею в виду   -  person Tensibai    schedule 20.01.2016


Ответы (1)


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

x <- scan(what = character(), 
text = "[-0.2122,-0.1213)
[-0.2750,-0.2122)
[-0.1213,-0.0222)
[-0.1213,-0.0222)")

regmatches(x, regexpr("(?<=\\[).+(?=\\))", x, perl = TRUE))
# [1] "-0.2122,-0.1213" "-0.2750,-0.2122" "-0.1213,-0.0222" "-0.1213,-0.0222"
person Thomas    schedule 20.01.2016
comment
Звучит чересчур, и при этом я бы разделил числа двумя группами захвата. - person Tensibai; 20.01.2016