具有许多带有模式的字符串:
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
答案 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"