R中的正则表达式:仅替换模式的一部分

时间:2015-10-11 14:20:23

标签: regex r

s <- "YXABCDXABCDYX"

我想使用正则表达式返回ABCDABCD,即中心"X"每侧有4个字符,但不包括"X"。 请注意,"X"始终位于中心,每侧有6个字母

我可以找到中心模式,例如"[A-Z]{4}X[A-Z]{4}",但我可以以某种方式让返回成为"([A-Z]{4})(X)([A-Z]{4})"中的第一和第三组吗?

1 个答案:

答案 0 :(得分:6)

您的正则表达式"([A-Z]{4})(X)([A-Z]{4})"与您的字符串不匹配,因为您在第一个捕获组([A-Z]{4})之前有字符,因此您可以添加.*以匹配任何字符({{1 }} 0次或更多次(.),直到你的第一个捕获组。

您可以使用*引用gsub中的组,其中n是第n个捕获组

\\n

基本上匹配整个字符串,并将其替换为第1组和第3组中捕获的内容并将其粘贴在一起。

另一种方法是使用不区分大小写匹配的s <- "YXABCDXABCDYX" gsub('.*([A-Z]{4})(X)([A-Z]{4}).*', '\\1\\3', s) # [1] "ABCDABCD" 以及(?i)[a-z]

\\w

gsub('(?i).*(\\w{4})(x)(\\w{4}).*', '\\1\\3', s) # [1] "ABCDABCD" 如果你喜欢点