R Regex用于识别和替换多个点之间的字符
我有以下代码R Regex用于识别和替换多个点之间的字符,r,regex,string,stringr,R,Regex,String,Stringr,我有以下代码 "ABC.A.SVN.10.10.390.10.UDGGL" "XYZ.Z.SVN.11.12.111.99.ASDDL" 我需要替换第二个和第三个点之间的字符。在这种情况下,它是SVN,但它很可能是A和ZZZ之间的任意组合,因此真正实现这一点的唯一方法是使用点 所需成果将是: "ABC.A..10.10.390.10.UDGGL" "XYZ.Z..11.12.111.99.ASDDL" 我尝试了grep(“^.+(\\\\\).$”,“ABC.A.SVN.10.10.390.
"ABC.A.SVN.10.10.390.10.UDGGL"
"XYZ.Z.SVN.11.12.111.99.ASDDL"
我需要替换第二个和第三个点之间的字符。在这种情况下,它是SVN
,但它很可能是A
和ZZZ
之间的任意组合,因此真正实现这一点的唯一方法是使用点
所需成果将是:
"ABC.A..10.10.390.10.UDGGL"
"XYZ.Z..11.12.111.99.ASDDL"
我尝试了grep(“^.+(\\\\\).$”,“ABC.A.SVN.10.10.390.10.UDGGL”)
的变体,但我得到了一个错误
我尝试过但没有成功的一些例子:
编辑
我尝试了@onyanbu的第一种方法,但遇到了一个我没有考虑的变体:“ABC.a.AB11.1.12.112.1123.UDGGL”
。在替换部件中,我也有数值。期望的结果是“ABC.A..1.12.112.1123.UDGGL”,我使用sub(“\\\.\\w+.\\B.”,“,”,x)
,在他的答案的第二部分得到它
x= "ABC.A.SVN.10.10.390.10.UDGGL" "XYZ.Z.SVN.11.12.111.99.ASDDL"
sub("([A-Z]+)(\\.\\d+)","\\2",x)
[1] "ABC.A..10.10.390.10.UDGGL" "XYZ.Z..11.12.111.99.ASDDL"
捕获包含字符A-Z的任何单词([A-Z]+)
上面捕获的单词后面必须跟一个点,即(\\.\\d+
。这个点后面跟着数字,即\\.
。这就完成了捕获\\d+
SVN.10
,因为这是与正则表达式匹配的部分。但是这部分被捕获为SVN
和.10
。我们使用第二部分.10
替换整个SVN.10
另一个可行的逻辑是:
sub("\\.\\w+.\\B.",".",x)
[1] "ABC.A..10.10.390.10.UDGGL" "XYZ.Z..11.12.111.99.ASDDL"
捕获包含字符A-Z的任何单词([A-Z]+)
上面捕获的单词后面必须跟一个点,即(\\.\\d+
。这个点后面跟着数字,即\\.
。这就完成了捕获\\d+
SVN.10
,因为这是与正则表达式匹配的部分。但是这部分被捕获为SVN
和.10
。我们使用第二部分.10
替换整个SVN.10
另一个可行的逻辑是:
sub("\\.\\w+.\\B.",".",x)
[1] "ABC.A..10.10.390.10.UDGGL" "XYZ.Z..11.12.111.99.ASDDL"
x
x不完全是正则表达式,但这里还有一种方法
#DATA
S = c("ABC.A.SVN.10.10.390.10.UDGGL", "XYZ.Z.SVN.11.12.111.99.ASDDL")
sapply(X = S,
FUN = function(str){
ind = unlist(gregexpr("\\.", str))[2:3]
paste(c(substring(str, 1, ind[1]),
"SUBSTITUTION",
substring(str, ind[2], )), collapse = "")
},
USE.NAMES = FALSE)
#[1] "ABC.A.SUBSTITUTION.10.10.390.10.UDGGL" "XYZ.Z.SUBSTITUTION.11.12.111.99.ASDDL"
不完全是正则表达式,但这里还有一种方法
#DATA
S = c("ABC.A.SVN.10.10.390.10.UDGGL", "XYZ.Z.SVN.11.12.111.99.ASDDL")
sapply(X = S,
FUN = function(str){
ind = unlist(gregexpr("\\.", str))[2:3]
paste(c(substring(str, 1, ind[1]),
"SUBSTITUTION",
substring(str, ind[2], )), collapse = "")
},
USE.NAMES = FALSE)
#[1] "ABC.A.SUBSTITUTION.10.10.390.10.UDGGL" "XYZ.Z.SUBSTITUTION.11.12.111.99.ASDDL"
这个答案是我使用的,因为它对我来说更容易,作为一个非正则表达式专家。我还可以使用tweep元素自定义where{2}
。这个答案是我使用的,因为它对我来说更容易,因为我不是正则表达式专家。我还可以使用两次元素自定义where{2}
。