Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.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
R gsub中的负前瞻_R_Regex - Fatal编程技术网

R gsub中的负前瞻

R gsub中的负前瞻,r,regex,R,Regex,在最近的一个场景中,我想提取url向量的最后一部分。 例如 基本上,我在寻找第一个示例中返回结果的regexp逻辑,但只使用一个gsub调用。我首选的方法是用字符串的一部分替换整个字符串,如下所示: gsub("^.*/([^/]+/)$", "\\1", urls) \\1匹配内部匹配的内容。 因此,基本上我用url的最后一部分替换整个字符串。我更喜欢的方法是用字符串的部分替换整个字符串,如下所示: gsub("^.*/([^/]+/)$&q

在最近的一个场景中,我想提取url向量的最后一部分。 例如


基本上,我在寻找第一个示例中返回结果的regexp逻辑,但只使用一个gsub调用。

我首选的方法是用字符串的一部分替换整个字符串,如下所示:

gsub("^.*/([^/]+/)$", "\\1", urls)
\\1匹配内部匹配的内容。
因此,基本上我用url的最后一部分替换整个字符串。

我更喜欢的方法是用字符串的部分替换整个字符串,如下所示:

gsub("^.*/([^/]+/)$", "\\1", urls)
\\1匹配内部匹配的内容。
因此,基本上我用url的最后一部分替换整个字符串。

要仅获得匹配,您仍然可以使用lookahead结构:

^.*/(?=[^/]*/$)
^字符串的开头 */匹配到最后一个/ ?=正向前瞻,断言右边的是 [^/]*/$assert右边的值是除/以外的任何字符的0+倍,然后在字符串末尾匹配/ 近距离前瞻 |

比如说

gsub('^.*/(?=[^/]*/$)', '', urls, perl = TRUE)
使用负前瞻的选项:

^.*/(?!$)
^字符串开头 .*/匹配最后一个/ ?!$ 负向前看,断言直接向右的不是字符串的结尾
要仅获取匹配项,您仍然可以使用前瞻结构:

^.*/(?=[^/]*/$)
^字符串的开头 */匹配到最后一个/ ?=正向前瞻,断言右边的是 [^/]*/$assert右边的值是除/以外的任何字符的0+倍,然后在字符串末尾匹配/ 近距离前瞻 |

比如说

gsub('^.*/(?=[^/]*/$)', '', urls, perl = TRUE)
使用负前瞻的选项:

^.*/(?!$)
^字符串开头 .*/匹配最后一个/ ?!$ 负向前看,断言直接向右的不是字符串的结尾
非正则表达式&非常快速的解决方案是使用basename:

或者,对于您的情况:

paste0(basename(urls), '/')
[1] "hij/" "lmn/" "opr/"

非正则表达式&非常快速的解决方案是使用basename:

或者,对于您的情况:

paste0(basename(urls), '/')
[1] "hij/" "lmn/" "opr/"

sub.*/[^/]*/$,\\1,URL谢谢Wiktor。好像我迷路了。如果您将此作为一个带有1-2行文本的答案添加,我将接受它作为答案。您也可以使用前瞻,尽管效率较低^.*[^/]+/?=[^/]*/$Thork@Thefourthbird。事实上,这是一个练习,在学习看头和消极的看头,所以这是一个多一点我喜欢。虽然我希望这是一个答案,而不是一个评论。我会听从我的话,接受你的答案,即使它是重复的。尽管我会撤销对任何使用负面表情给出例子的人的接受,这样我就能看出我的逻辑在哪里失败了-sub.*/[^/]*/$,\\1,URL谢谢Wiktor。好像我迷路了。如果您将此作为一个带有1-2行文本的答案添加,我将接受它作为答案。您也可以使用前瞻,尽管效率较低^.*[^/]+/?=[^/]*/$Thork@Thefourthbird。事实上,这是一个练习,在学习看头和消极的看头,所以这是一个多一点我喜欢。虽然我希望这是一个答案,而不是一个评论。我会听从我的话,接受你的答案,即使它是重复的。尽管我会撤销对任何使用负面表情给出例子的人的接受,这样我就能看出我的逻辑在哪里失败了-很快就会清除:这比使用简单的微基准点替换火柴快40%左右。谢谢,如果没有人给出“消极前瞻”的答案,我会接受这个答案。@Oliver好吧,使用消极前瞻可能是^.*/!$因此,您可以回溯到倒数第二个/断言它不是倒数第二个/才起作用。删除冗余^it比“向前看”要稍微快一点。我不知道你可以用消极的前瞻来简单地断言不在最后。整洁的很快就会清除:这比使用简单的微基准点替换火柴快40%左右。谢谢,如果没有人给出“消极前瞻”的答案,我会接受这个答案。@Oliver好吧,使用消极前瞻可能是^.*/!$因此,您可以回溯到倒数第二个/断言它不是倒数第二个/才起作用。删除冗余^it比“向前看”要稍微快一点。我不知道你可以用消极的前瞻来简单地断言不在最后。整洁的