Closed. This question needs details or clarity。它当前不接受答案。












想改善这个问题吗?添加详细信息,并通过editing this post阐明问题。

6年前关闭。



Improve this question



1.for(sublen in len:1) {
2.        for(inlen in 0:sublen) {
3.      pat <- paste0("((.{", sublen-inlen, "})(.)(.{", inlen, "}))", reps("(\\2.\\4)", th-1))
4.            r <- regexpr(pat, string, perl = TRUE)

因此,我有这段代码,其中len的值为3,th = 3。现在,代表是我创建的函数,类似于
5.s <- function(s, n) paste(rep(s, n), collapse = "")

我想了解1-4行实际上是做什么的?我知道,在第5行中,有一个函数基本上重复了n次。我真正想知道的是,第3行中发生了什么。我尝试在R中尝试使用此命令。
paste0("(  ( .{", 3-0, "} ) (.) ( .{", 0, "} )  )",  rep("(\\2.\\4)", 3-1) )

与输出,但是实际上如何通过第4行的regexpr命令与模式匹配?
[1] "(  ( .{3} ) (.) ( .{0} )  )(\\2.\\4)" "(  ( .{3} ) (.) ( .{0} )  )(\\2.\\4)"

编辑:字符串示例:110110111
在添加了几行代码(如果大于0则比较)之后,基本上返回的结果将是“110”的模式,尽管在最后一个字符处涉及到一些干扰,并且模式并不完美。但是,它实际上如何与paste0命令一起使用?

最佳答案

这实际上与paste0没有任何关系。此代码仅使用paste0来构建正则表达式。在len和th = 3的情况下,它将产生以下模式(我使用cat打印了这些模式,以消除将字符打印到控制台时R使用的嘈杂的斜杠转义)

((.{3})(.)(.{0}))(\2.\4)(\2.\4)
((.{2})(.)(.{1}))(\2.\4)(\2.\4)
((.{1})(.)(.{2}))(\2.\4)(\2.\4)
((.{0})(.)(.{3}))(\2.\4)(\2.\4)
((.{2})(.)(.{0}))(\2.\4)(\2.\4)
((.{1})(.)(.{1}))(\2.\4)(\2.\4)
((.{0})(.)(.{2}))(\2.\4)(\2.\4)
((.{1})(.)(.{0}))(\2.\4)(\2.\4)
((.{0})(.)(.{1}))(\2.\4)(\2.\4)

括号捕获字符串的一部分。 .表示任何字符。 {n}值查找重复n次的前一个字符。并且\nn-th捕获组的内容匹配。

列表中的第二个模式
((.{2})(.)(.{1}))(\2.\4)(\2.\4)

寻找形式的字符串
AAxBAAyBAAzB

其中xyz可以是任意值,并且所有A值必须匹配且所有B值必须匹配。您可以测试此模式here

因此,您的示例模式
110110111

将两者都匹配
((.{2})(.)(.{0}))(\2.\4)(\2.\4)
((.{0})(.)(.{1}))(\2.\4)(\2.\4)

我强烈建议您在某个地方在线找到一些正则表达式的介绍,如果您真的对理解代码感兴趣,请仔细阅读。

08-24 14:48