Заменить второй экземпляр пунктуации в строке? - PullRequest
0 голосов
/ 24 января 2019

У меня много строк с рисунком:

A / B / C / D

Мне просто нужно изменить 2-й знак '/' на что-то другое (скажем, *)

То есть A / B / C / D -> A / B * C / D

gsub('(^[[:punct:]])([[:punct:]])', "*", string) #Didn't Work
gsub('[[:punct:]]{2}', "*", string) #Didn't work

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Мы можем попытаться с помощью sub захватить один или несколько символов, которые не являются /, за которыми следуют / и символы, которые не являются / в качестве группы, и при замене использовать обратную ссылку (\\1) захваченной группы с символом *

sub("^([^/]+[/][^/]+)[/]", "\\1*", str1)
#[1] "A/B*C/D"

Также, если строка имеет фиксированную длину с каждой буквой, за которой следует /, тогда можно выполнить присвоение с помощью substring

substring(str1, 4, 4) <- "*"

данные

str1 <- 'A/B/C/D'
0 голосов
/ 24 января 2019

Мы можем использовать вид сзади для сопоставления /, который следует за шаблоном "слово-символ-косая черта-слово":

sub("(?<=^\\w/\\w)/", "*", "A/B/C/D", perl = TRUE)
# [1] "A/B*C/D"

Аналогично, мы также можем использовать вид вперед:

sub("/(?=\\w/\\w$)", "*", "A/B/C/D", perl = TRUE)
# [1] "A/B*C/D"

Конечно, мы также можем использовать комбинацию [^[:punct:]] и [[:punct:]] для достижения того же результата в этом случае.Имейте в виду, что следующий шаблон является более общим:

sub("(?<=^[^[:punct:]][[:punct:]][^[:punct:]])[[:punct:]]", "*", "A/B/C/D", perl = TRUE)
# [1] "A/B*C/D"
0 голосов
/ 24 января 2019

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

sub("([^[:punct:]]*[[:punct:]][^[:punct:]]*)[[:punct:]]", "\\1*", string)

См. Демоверсию regex

Функция sub найдет единственное (первое) вхождение

  • ([^[:punct:]]*[[:punct:]][^[:punct:]]*) - Группа 1 (\1 относится к этому значению из шаблона замены): 0+ символов, кроме символов пунктуации, символ пунктуации, а затем снова 0+ символов, кроме символов пунктуации
  • [[:punct:]] - знак пунктуации.

В качестве альтернативы вы можете попробовать аналогичное регулярное выражение PCRE, например

sub("\\P{P}*\\p{P}\\P{P}*\\K\\p{P}", "*", string, perl=TRUE)

См. это демо регулярных выражений .

Однако \p{P} не соответствует тому, что [[:punct:]] делает , поэтому будьте осторожны. Или замените все \p{P} на [\p{P}\p{S}] и все \P{P} на [^\p{P}\p{S}].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...