替换字符串中标点符号的第二个实例?

时间:2019-01-24 18:18:08

标签: r regex

具有许多带有模式的字符串:

A / B / C / D

我只需要将第二个'/'更改为其他名称(例如*)

所以A / B / C / D-> A / B * C / D

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

3 个答案:

答案 0 :(得分:2)

您可以使用

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

请参见regex demo

sub函数将发现

的单个(第一次)出现
  • ([^[:punct:]]*[[:punct:]][^[:punct:]]*)-第1组(\1指的是替换模式中的该值):0+除标点符号之外的字符,标点符号,然后0+除标点符号之外的字符
  • [[:punct:]]-标点符号。

或者,您也可以尝试类似的PCRE正则表达式

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

请参见this regex demo

但是,\p{P} does not match what [[:punct:]] does,所以要小心。或将所有\p{P}替换为[\p{P}\p{S}],并将所有\P{P}替换为[^\p{P}\p{S}]

答案 1 :(得分:2)

我们可以尝试使用sub来捕获不是/的一个或多个字符,然后是/和不是/的字符作为组,在替换中,使用字符\\1

捕获组的反向引用(*
sub("^([^/]+[/][^/]+)[/]", "\\1*", str1)
#[1] "A/B*C/D"

此外,如果字符串的长度固定,每个字母后跟/,则可以用substring进行赋值

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

数据

str1 <- 'A/B/C/D'

答案 2 :(得分:0)

我们可以使用后面的匹配方式来匹配/,该方式遵循“单词字符正斜杠字符”的样式:

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"