Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从正则表达式中提取捕获组匹配项?(或者:gregexec在哪里?)_Regex_R_Backreference - Fatal编程技术网

从正则表达式中提取捕获组匹配项?(或者:gregexec在哪里?)

从正则表达式中提取捕获组匹配项?(或者:gregexec在哪里?),regex,r,backreference,Regex,R,Backreference,给定一个包含(括号)和字符串的正则表达式,如何获得与捕获组匹配的所有子字符串,即通常由“\1”、““\2”引用的子字符串 示例:考虑前面的“XY”的正则表达式捕获数字: 第一次尝试:gregexpr: regmatches(s,gregexpr(r,s)) #[[1]] #[1] "xy1234" "xy567" 不是我想要的,因为它返回与整个模式匹配的子字符串 第二次尝试:regexec: regmatches(s,regexec("xy(\\d+)",s)) #[[1]] #[1] "x

给定一个包含(括号)和字符串的正则表达式,如何获得与捕获组匹配的所有子字符串,即通常由“\1”、““\2”引用的子字符串

示例:考虑前面的“XY”的正则表达式捕获数字:

第一次尝试:
gregexpr

regmatches(s,gregexpr(r,s))
#[[1]]
#[1] "xy1234" "xy567" 
不是我想要的,因为它返回与整个模式匹配的子字符串

第二次尝试:
regexec

regmatches(s,regexec("xy(\\d+)",s))
#[[1]]
#[1] "xy1234" "1234" 
不是我想要的,因为它只返回整个模式和捕获组的第一次匹配

如果有一个
gregexec
函数,将
regexec
扩展为
gregexpr
extends
regexpr
,我的问题就会得到解决

因此,问题是:如何在任意正则表达式中检索匹配捕获组的所有子字符串(或可以传递给
regmatches
的索引,如上面的示例所示)


注意:上面给出的
r
模式只是一个愚蠢的例子,它必须保持任意性。

不确定是否在base中执行此操作,但这里有一个满足您需要的包:

library(stringr)

str_match_all(s, r)
#[[1]]
#     [,1]     [,2]  
#[1,] "xy1234" "1234"
#[2,] "xy567"  "567" 
许多
stringr
函数在基R中也有相似之处,因此您也可以在不使用
stringr
的情况下实现这一点

例如,下面是上述工作原理的简化版本,使用base R:

sapply(regmatches(s,gregexpr(r,s))[[1]], function(m) regmatches(m,regexec(r,m)))

Straplyc
在中执行以下操作:

> library(gsubfn)
>
> strapplyc(s, r)
[[1]]
[1] "1234" "567" 
有关更多信息和示例,请尝试
?Straplyc

相关功能

1)
Straplyc
的概括是
Straply
在同一个包中。它接受一个函数,该函数输入每个匹配的捕获部分并返回该函数的输出。当该函数为
c
时,它将减少为
stripplyc
。例如,假设我们希望以数字形式返回结果:

> strapply(s, r, as.numeric)
[[1]]
[1] 1234  567
2)
gsubfn
是同一软件包中的另一个相关函数。它类似于
gsub
,只是替换字符串可以是替换函数(或替换列表或替换原型对象)。替换功能输入捕获的部分并输出替换。替换将替换输入字符串中的匹配项。如果使用公式(如本例中所示),则公式的右侧将被视为函数体。在本例中,我们将匹配替换为
XY{#}
,其中#是匹配输入数的两倍

> gsubfn(r, ~ paste0("XY{", 2 * as.numeric(x), "}"), s)
[1] "XY{2468}wz98XY{1134}"

更新:添加了
strapply
gsubfn
示例。

对于基本R解决方案,只使用
gsub()
来完成处理
gregexpr()
regmatches()
提取的字符串怎么样


这正是我需要的。我查一下它的来源。考虑到这是一项基本任务,我相信base R中有(或应该有)一个解决方案。它只使用
lappy
regexec
(尽管很聪明)。。。只需键入
str\u match\u all
str\u match
即可看到这一点……这太棒了。有一个问题:
Straplyc
是否像
stringr::str_match_all
那样在循环中调用
regexec
Straplyc
使用用tcl(字符串处理语言)编写的底层代码来处理非常大的字符串并提高速度(除非
engine=
参数指定不同的引擎)。有关详细信息,请参阅
?Straplyc
。非常感谢您的回答。我接受了eddi的答案,因为他是正确的,并且首先回答了问题。这是一个不错的技巧,但如果捕获组在一个环顾四周(
perl=TRUE
)中,它可能会失败。@Ferdinand.kraft——你能举个例子吗?我认为搜索引擎不是被捕获的,所以我不能看到你的意思。考虑一下:<代码> R @费迪南德。卡夫-很有趣地看到它们确实被捕获了(即使它们没有被ReEX算法‘吃掉’)。
> strapply(s, r, as.numeric)
[[1]]
[1] 1234  567
> gsubfn(r, ~ paste0("XY{", 2 * as.numeric(x), "}"), s)
[1] "XY{2468}wz98XY{1134}"
s <- "xy1234wz98xy567"
r <- "xy(\\d+)"

gsub(r, "\\1", regmatches(s,gregexpr(r,s))[[1]])
# [1] "1234" "567"