Regex 正则表达式-通过gsub中的正则表达式匹配排除URL的特定部分
我正在使用下面的向量:Regex 正则表达式-通过gsub中的正则表达式匹配排除URL的特定部分,regex,r,string,regex-negation,gsub,Regex,R,String,Regex Negation,Gsub,我正在使用下面的向量: vec <- c("http://statistics.gov.scot/id/statistical-geography/S02000002", "http://statistics.gov.scot/id/statistical-geography/S02000003") 但这只剩下vectorvec中的最后一个数字。我猜问题在于\\d{8},但是,我不清楚如何解决这个问题。我试过各种各样的解决办法,但都没有用。一些例子: (?-留下第二个
vec <- c("http://statistics.gov.scot/id/statistical-geography/S02000002",
"http://statistics.gov.scot/id/statistical-geography/S02000003")
但这只剩下vectorvec
中的最后一个数字。我猜问题在于\\d{8}
,但是,我不清楚如何解决这个问题。我试过各种各样的解决办法,但都没有用。一些例子:
(?-留下第二个数字
(?-相同)
gsub
和regex
找到解决方案,我不想使用:
- 和原型物体
- 我对使用
不感兴趣,因为我可能需要处理长度可变的字符串substr
sub(".*(S\\d{8})", "\\1", vec)
看
使用*
,我们可以匹配任意数量的(*
-0或更多)字符,但要在S
后面加上8位(S\\d{8}
)。因为(S\\d{8})
位于未替换的括号内,与此子模式匹配的子字符串被放入捕获组#1中。通过\\1
反向引用,我们恢复结果中捕获的文本
有关和的更多信息,请访问regular-expressions.info
注意:如果在S
+8位之后有更多文本,可以使用
sub("^.*(S\\d{8}).*$", "\\1", vec)
您可以使用
sub(".*(S\\d{8})", "\\1", vec)
看
使用*
,我们可以匹配任意数量的(*
-0或更多)字符,但要在S
后面加上8位(S\\d{8}
)。因为(S\\d{8})
位于未替换的括号内,与此子模式匹配的子字符串被放入捕获组#1中。通过\\1
反向引用,我们恢复结果中捕获的文本
有关和的更多信息,请访问regular-expressions.info
注意:如果在S
+8位之后有更多文本,可以使用
sub("^.*(S\\d{8}).*$", "\\1", vec)
在这里,它的语法稍微漂亮一些:
library(rex)
library(stringi)
library(magrittr)
regex_1 = rex("S", digits)
vec <- c("http://statistics.gov.scot/id/statistical-geography/S02000002",
"http://statistics.gov.scot/id/statistical-geography/S02000003")
vec %>% stri_extract_last_regex(regex_1)
库(rex)
图书馆(stringi)
图书馆(magrittr)
regex_1=rex(“S”,数字)
向量%stri\u extract\u last\u正则表达式(正则表达式1)
这里的语法稍微漂亮一些:
library(rex)
library(stringi)
library(magrittr)
regex_1 = rex("S", digits)
vec <- c("http://statistics.gov.scot/id/statistical-geography/S02000002",
"http://statistics.gov.scot/id/statistical-geography/S02000003")
vec %>% stri_extract_last_regex(regex_1)
库(rex)
图书馆(stringi)
图书馆(magrittr)
regex_1=rex(“S”,数字)
向量%stri\u extract\u last\u正则表达式(正则表达式1)
仅供参考。([:alnum:].[:punct:].])
也不会匹配任何东西。*(?=S\\d{8})
这个正则表达式会匹配,并确保它后面跟着S,后面跟着8位数字(通过正向前瞻),这就是您要查找的内容?或者说,所有内容都是第一个S+8位数字:?(更新)FWIW您使用了一个负面的lookback,即:这之后是什么(?如果可能有多个Sxxx,您可以使用非贪婪版本。如果您想摆脱Sxxx部分,请使用(*?)(=S\d{8})。*
并替换为$1
,仅供参考。([:alnum:].[:punch:]]
也将不匹配任何内容。*(?=S\\d{8})
此正则表达式将执行、匹配并确保它后面跟着S,后面跟着8位数字(通过正向前瞻)是您要查找的内容?或者,实际上,所有内容直到前S+8位:?(更新)FWIW您使用的是负前瞻,即:这之后是什么(?如果可以使用多个Sxxx,您可以使用非贪婪版本。如果您想摆脱Sxxx部分,请使用(.*)(=S\d{8})。*
并替换为$1
,它肯定非常可读,但需要很多库。它肯定非常可读,但需要很多库。为什么使用[\s\s]
而不仅仅是
?由于两者是互补的,这似乎过于复杂了regex@Tensibai:这是真的。我只是更习惯于基于PCRE的正则表达式,
在不设置单行模式的情况下不匹配换行符。事实上,它需要在正则表达式的开头使用多行修饰符。但我认为它可以做到这一点更具可读性。@Tensibai:谢谢您的评论,我删除了不必要的替代解决方案以避免任何混淆。为什么要使用[\s\s]
而不仅仅是
?由于两者是互补的,这似乎过于复杂了regex@Tensibai:这是真的。我只是更习惯于基于PCRE的正则表达式,
在不设置单行模式的情况下不匹配换行符。事实上,它需要在正则表达式的开头使用多行修饰符。但我认为它可以做到这一点更具可读性。@Tensibai:谢谢你的评论,我删除了不必要的替代解决方案以避免任何混淆。