R - 替换正则表达式中的第 1 组匹配但不是完全匹配
R - Replace Group 1 match in regex but not full match
假设我想提取字母 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 很简单,但是当需要替换时我还没有找到解决方案。
通常当我想替换 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"
等等...
您可以在互联网上搜索 "regular expressions in R using grep" 并找到许多使用正则表达式的方法。
这不是正则表达式的设计方式。捕获是一种获取所需字符串部分的机制,在替换时,它用于保留部分匹配,而不是丢弃。
因此,一个自然的解决方案是将您需要保留的内容包装在捕获组中。
在这种情况下,使用
str_replace_all("abc", "(a)[a-z](c)", "\1z\2")
或者环视(如果后视是 fixed/known 宽度模式):
str_replace_all("abc", "(?<=a)[a-z](?=c)", "z")
假设我想提取字母 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 很简单,但是当需要替换时我还没有找到解决方案。
通常当我想替换 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"
等等...
您可以在互联网上搜索 "regular expressions in R using grep" 并找到许多使用正则表达式的方法。
这不是正则表达式的设计方式。捕获是一种获取所需字符串部分的机制,在替换时,它用于保留部分匹配,而不是丢弃。
因此,一个自然的解决方案是将您需要保留的内容包装在捕获组中。
在这种情况下,使用
str_replace_all("abc", "(a)[a-z](c)", "\1z\2")
或者环视(如果后视是 fixed/known 宽度模式):
str_replace_all("abc", "(?<=a)[a-z](?=c)", "z")