缺少 gsub 在两个逗号之间添加字符串
gsub is missing to add string between two commas
我有以下字符串:
a <- "2015,,,,6GR,09,PRIVATE,NP,001"
我想在每个逗号之间添加 "YES"。所以我想要以下输出:
"2015,YES,YES,YES,6GR,09,PRIVATE,NP,001"
我尝试了以下行:
gsub("([,])([,])", "\1YES\2", a)
但我的输出是:
"2015,YES,,YES,6GR,09,PRIVATE,NP,001"
有人能告诉我为什么 gsub 中间缺少两个逗号吗?我该如何解决这个问题?
我会尝试用不同的方式为您解决,而不是尝试回答您的问题,我不能回答您的问题。
就去做吧:
a= unlist(strsplit(a,","))
a[a==""]="YES"
a=paste(a,collapse=",")
你可以使用正 look-ahead :
gsub(",(?=,)",",YES",a,perl=TRUE)
# [1] "2015,YES,YES,YES,6GR,09,PRIVATE,NP,001"
或者正数 look-behind :
gsub("(?<=,),","YES,",a,perl=TRUE)
# [1] "2015,YES,YES,YES,6GR,09,PRIVATE,NP,001"
你的方法的问题是你的正则表达式 "consumes" 前两个连续的逗号并认为匹配,然后继续下一个连续的两个逗号,错过了中间的匹配。
相反,look-ahead 和 look-behind 部分(即 (?=,)
和 (?<=,)
)中的字符实际上不是正则表达式的 "consumed",因此它有效。
perl=TRUE
启用支持 look-around 功能的 regular-expression 风格。
问题是在匹配,,
之后第二个逗号不是re-scanned。在 "\B"
匹配 non-word-boundary 的地方试试这个,以避免必须匹配第二个逗号。只要您没有以 non-word 字符开头的字段(例如 "A,,,;B"
),这就应该有效。它也不适用于第一个和最后一个字段,但问题中的表达式对这些字段也不起作用,因此我们假设这不是问题。
gsub(",\B", ",YES", a)
## [1] "2015,YES,YES,YES,6GR,09,PRIVATE,NP,001"
我有以下字符串:
a <- "2015,,,,6GR,09,PRIVATE,NP,001"
我想在每个逗号之间添加 "YES"。所以我想要以下输出:
"2015,YES,YES,YES,6GR,09,PRIVATE,NP,001"
我尝试了以下行:
gsub("([,])([,])", "\1YES\2", a)
但我的输出是:
"2015,YES,,YES,6GR,09,PRIVATE,NP,001"
有人能告诉我为什么 gsub 中间缺少两个逗号吗?我该如何解决这个问题?
我会尝试用不同的方式为您解决,而不是尝试回答您的问题,我不能回答您的问题。
就去做吧:
a= unlist(strsplit(a,","))
a[a==""]="YES"
a=paste(a,collapse=",")
你可以使用正 look-ahead :
gsub(",(?=,)",",YES",a,perl=TRUE)
# [1] "2015,YES,YES,YES,6GR,09,PRIVATE,NP,001"
或者正数 look-behind :
gsub("(?<=,),","YES,",a,perl=TRUE)
# [1] "2015,YES,YES,YES,6GR,09,PRIVATE,NP,001"
你的方法的问题是你的正则表达式 "consumes" 前两个连续的逗号并认为匹配,然后继续下一个连续的两个逗号,错过了中间的匹配。
相反,look-ahead 和 look-behind 部分(即 (?=,)
和 (?<=,)
)中的字符实际上不是正则表达式的 "consumed",因此它有效。
perl=TRUE
启用支持 look-around 功能的 regular-expression 风格。
问题是在匹配,,
之后第二个逗号不是re-scanned。在 "\B"
匹配 non-word-boundary 的地方试试这个,以避免必须匹配第二个逗号。只要您没有以 non-word 字符开头的字段(例如 "A,,,;B"
),这就应该有效。它也不适用于第一个和最后一个字段,但问题中的表达式对这些字段也不起作用,因此我们假设这不是问题。
gsub(",\B", ",YES", a)
## [1] "2015,YES,YES,YES,6GR,09,PRIVATE,NP,001"