给定字符串"http://compras.dados.gov.br/materiais/v1/materiais.html?pdm=08275/",我需要生成一个regex过滤器,这样如果它是"/“,它就会忽略最后一个字符。
我尝试了下面的regex "(http:////)?compras\\.dados\\.gov\\.br.*\\?.*(?<!//)"作为regexr.com/4om61,但是当我在R中运行时,它不起作用:
regex_exp_R <- "(http:////)?compras\\.dados\\.gov\\.br.*\\?.*(?<!//)"
grep(regex_exp_R, "http://compras.dados.gov.br/materiais/v1/materiais.html?pdm=08275/", perl = T, value = T)我需要它在纯正则表达式和grep函数中工作,而不使用任何字符串R包。谢谢。
简化案例:在你们大家的重要贡献之后,还有最后一个问题。因为我将使用regex作为另一个连接的输入,所以解决方案必须使用纯regex和grep。
剩下的一点是非常基本的:给定字符串"a1bc/“或"a1bc",regex必须返回"a1bc”。在收到的建议的基础上,我尝试了
grep(".*[^//]" ,"a1bc/", perl = T, value = T),但仍然得到"a1bc/“而不是"a1bc”。有什么暗示吗?谢谢。
发布于 2019-11-12 17:06:43
如果您想在不使用最后一个/的情况下返回字符串,可以使用几种方法。下面是使用基本R的几个选项:
在gsub()中使用反向引用(sub()在这里也适用):
gsub("(.*?)/*$", "\\1", x)
[1] "http://compras.dados.gov.br/materiais/v1/materiais.html?pdm=08275"
# or, adapting your original pattern
gsub("((http:////)?compras\\.dados\\.gov\\.br.*\\?.*?)/*$", "\\1", x)
[1] "http://compras.dados.gov.br/materiais/v1/materiais.html?pdm=08275"按位置使用ifelse()和substr() (如果缩放重要的话,速度会更快一些)
ifelse(substr(x, nchar(x), nchar(x)) == "/", substr(x, 1, nchar(x)-1), x)
[1] "http://compras.dados.gov.br/materiais/v1/materiais.html?pdm=08275"数据
x <- "http://compras.dados.gov.br/materiais/v1/materiais.html?pdm=08275/"发布于 2019-12-07 09:15:55
使用sub删除尾随的/
x <- c("a1bc/", "a2bc")
sub("/$", "", x)这对不以/结尾的字符串没有任何改变。
正如其他人所指出的,grep不修改字符串。它返回匹配字符串的索引的数字向量或(未经修改的)匹配项的向量。它通常用于对字符向量进行子集。
发布于 2019-12-07 10:07:01
您可以在结尾处使用负面的回顾,以确保它不会以您不想要的字符(在本例中为/)结束。这样,准则将是:
.+(?<!\/)您可以在这里使用三个输入示例查看它:https://regex101.com/r/XB9f7K/1/。如果您只希望它与url匹配,那么您将在开始时将.+部件更改为url。
https://stackoverflow.com/questions/58823101
复制相似问题