R 正则表达式结果

R 正则表达式结果,r,regex,R,Regex,代码 有人知道为什么输入中的第二个0没有被替换为输出中的1吗? 我正在寻找字符串中的模式101,并将其替换为字符串111。稍后,我希望将较长的子序列转换为1的序列,例如10001到11111。这是因为它不以递归方式工作 gsub('101','111','110101101')在查找匹配项时对第三个字符串进行除法。它找到了第一个101,左边是01101。想想看。如果它将“递归地”替换,像gsub('11','111','11')这样的东西将返回一个无限字符串'1'并中断。它不会签入已经“替换”的

代码

有人知道为什么输入中的第二个0没有被替换为输出中的1吗?
我正在寻找字符串中的模式101,并将其替换为字符串111。稍后,我希望将较长的子序列转换为1的序列,例如10001到11111。

这是因为它不以递归方式工作


gsub('101','111','110101101')在查找匹配项时对第三个字符串进行除法。它找到了第一个101,左边是01101。想想看。如果它将“递归地”替换,像gsub('11','111','11')这样的东西将返回一个无限字符串'1'并中断。它不会签入已经“替换”的文本。

这是因为它不以递归方式工作


gsub('101','111','110101101')在查找匹配项时对第三个字符串进行除法。它找到了第一个101,左边是01101。想想看。如果它将“递归地”替换,像gsub('11','111','11')这样的东西将返回一个无限字符串'1'并中断。它不会签入已经“替换”的文本。

您可以使用前瞻
?=

其工作方式是
q(?=u)
匹配后跟u的q,而不使u成为匹配的一部分


编辑:您需要在perl模式下使用gsub来使用lookaheads

您可以使用lookahead
?=

其工作方式是
q(?=u)
匹配后跟u的q,而不使u成为匹配的一部分


编辑:您需要在perl模式下使用gsub来使用lookaheads,这是因为当R第一次检测到110101101时,它将下一个0视为110101101中的011


您似乎只想将“0”替换为“1”。然后您可以使用
gsub('0','1','110101101')

这是因为当R第一次检测到110101101时,它将下一个0视为110101101中的011

您似乎只想将“0”替换为“1”。然后您可以使用
gsub('0','1','110101101')

稍后,我希望将较长的子序列转换为1的序列,例如10001到11111

希望R提供了一种基于匹配的子字符串生成替换字符串的方法。(这是一个常见功能。)

如果是这样,请搜索
10+
,并让替换字符串生成器创建一个字符串,该字符串由多个
1
字符组成,这些字符的长度等于匹配的长度。(例如,如果
100
匹配,则替换为
111
。如果
1000
匹配,则替换为
1111
。)

我一点也不了解R。以下是一些其他语言的使用方法,以防有帮助:

Perl:

Python:

$s =~ s{10+}{ "1" x length($&) }ger
JavaScript:

re.sub(r'10+', lambda match: '1' * len(match.group()), s)
JavaScript(ES6):

稍后,我希望将较长的子序列转换为1的序列,例如10001到11111

希望R提供了一种基于匹配的子字符串生成替换字符串的方法。(这是一个常见功能。)

如果是这样,请搜索
10+
,并让替换字符串生成器创建一个字符串,该字符串由多个
1
字符组成,这些字符的长度等于匹配的长度。(例如,如果
100
匹配,则替换为
111
。如果
1000
匹配,则替换为
1111
。)

我一点也不了解R。以下是一些其他语言的使用方法,以防有帮助:

Perl:

Python:

$s =~ s{10+}{ "1" x length($&) }ger
JavaScript:

re.sub(r'10+', lambda match: '1' * len(match.group()), s)
JavaScript(ES6):

根据OP

稍后,我希望将较长的子序列转换为1的序列, 比如10001到11111

如果我理解正确,最终目标是将连续
0
的任何子序列替换为相同数量的
1
,如果它们两边都被
1
包围

在R中,这可以通过
stringr
包中的
str\u replace\u all()
函数实现。对于演示和测试,
输入
向量包含一些边缘情况,其中
0
的子字符串不被
1
包围

s.replace(/10+/g, match => '1'.repeat(match.length))
正则表达式
“(?根据OP

稍后,我希望将较长的子序列转换为1的序列, 比如10001到11111

如果我理解正确,最终目标是将连续
0
的任何子序列替换为相同数量的
1
,如果它们两边都被
1
包围

在R中,这可以通过
stringr
包中的
str\u replace\u all()
函数来实现。对于演示和测试,
输入
向量包含一些边缘情况,其中
0
的子字符串不被
1
包围

s.replace(/10+/g, match => '1'.repeat(match.length))

正则表达式
”(?这增加了长度。你的意思是“gsub('10(?=1)”,'11','110101101'),对吗?啊,是的,很好的捕获!嘿,谢谢你的回答!当我运行代码时,我在gsub(“10(?=1)”,“11”,“110101101”)中得到错误:无效的正则表达式“10(?=1),原因是“无效的regexp”。知道为什么会发生这种情况吗?干杯:D,编辑:刚刚看到我们的编辑,只需要添加perl=True。这会增加长度。你的意思是“gsub('10(?=1'),'11','110101101')”,对吗?啊,是的,很好的捕获!嘿,谢谢你的回答!当我运行代码时,我在gsub(“10(?=1)”,“11”,“110101101”)中出现错误:无效的正则表达式“10(?=1)”,原因为“invalid regexp”。知道发生这种情况的原因吗?Cheers:D,edit:just saw ur edit,只需要添加perl=True他可能只想替换“1”之间的“0”,因此示例“1001”将保持不变。他可能只想替换“1”之间的“0”,因此示例“1001”将保持不变
input <- c("110101101",
         "11010110001",
         "110-01101",
         "11010110000",
         "00010110001")

library(stringr)
str_replace_all(input, "(?<=1)0+(?=1)", function(x) str_dup("1", str_length(x)))
[1] "111111111"   "11111111111" "110-01111"   "11111110000" "00011111111"