假设我要提取字母a
和c
之间的所有字母。到目前为止,我一直在使用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很容易,但在需要更换时我还没有找到解决方案。
答案 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;正则表达式进入互联网并找到许多方法来处理正则表达式。