R - 在正则表达式中替换组1匹配但不完全匹配

时间:2018-03-30 04:39:07

标签: r regex stringr

假设我要提取字母ac之间的所有字母。到目前为止,我一直在使用stringr包,它清楚地说明了完整的匹配和组。例如,包将给出以下内容。

library(stringr)
str_match_all("abc", "a([a-z])c")
# [[1]]
#     [,1]  [,2]
# [1,] "abc" "b" 

假设我只想替换组,而不是完全匹配---在这种情况下是字母b。但是,以下内容将取代完整的匹配。

str_replace_all("abc", "a([a-z])c", "z")
[1] "z"
# Desired result: "azc"

是否有任何好的方法只能替换捕获组?假设我想做多场比赛。

str_match_all("abcdef", "a([a-z])c|d([a-z])f")
# [[1]]
#      [,1]  [,2] [,3]
# [1,] "abc" "b"  NA
# [2,] "def" NA   "e"
str_replace_all("abcdef", "a([a-z])c|d([a-z])f", "z")
# [1] "zz"
# Desired result: "azcdzf"

Matching groups很容易,但在需要更换时我还没有找到解决方案。

2 个答案:

答案 0 :(得分:2)

这不是正则表达式的设计方式。捕获是一种获取所需字符串部分的机制,在替换时,它用于保持部分匹配,而不是 discard

因此,一个自然的解决方案是包装您需要保留的捕获组。

在这种情况下,请使用

str_replace_all("abc", "(a)[a-z](c)", "\\1z\\2")

或者使用外观(如果lookbehind是固定/已知的宽度模式):

str_replace_all("abc", "(?<=a)[a-z](?=c)", "z")

答案 1 :(得分:0)

通常当我想要替换text \ string中的某些字符模式时,我使用grep族函数,这就是我们所说的使用正则表达式。

您可以使用grep族函数的sub函数来替换字符串。

例:

sub("b","z","abc")
[1] "azc"

使用替换可能会遇到更多挑战,因为grep系列函数提供了许多功能:

按照您的偏好替换所有字符,除了a和c:

sub("[^ac]+","z","abBbbbc")
[1] "azc"

替换第二场比赛

sub("b{2}","z","abBbbbc")
[1] "abBzbc"

替换模式后面的所有字符:

sub("b.*","z","abc")
[1] "az"

以上相同,除了c:

sub("b.*[^c]","z","abc")
[1] "abc"

所以......

您可以使用grep&#34;在R中查找&#34;正则表达式进入互联网并找到许多方法来处理正则表达式。