【发布时间】:2015-11-27 16:23:01
【问题描述】:
我正在使用下面的矢量:
vec <- c("http://statistics.gov.scot/id/statistical-geography/S02000002",
"http://statistics.gov.scot/id/statistical-geography/S02000003")
我想从向量中删除http://statistics.gov.scot/id/statistical-geography/。我现在的regex 语法:
vec_cln <- gsub(replacement = "", x = vec, perl = TRUE, fixed = FALSE,
pattern = "([[:alnum:]]|[[:punct:]]|)(?<!S\\d{8})")
但这只留下向量vec 的最后一位数字。我猜问题出在\\d{8},但是,我不清楚如何解决它。我在regex101 上尝试了各种解决方案,但无济于事。一些例子:
-
(?<!S\d)- 这留下第二个数字 -
(?<!S[[:digit:]])- 一样
我想要实现的目标可以简单概括:*匹配所有内容,直到找到大写字母S和之后的8位数字。
注意事项
我想通过gsub 和regex 得到解决方案我不想使用:
-
gsubfn和原型对象 - 我对使用
substr不感兴趣,因为我可能需要处理可变长度的字符串
【问题讨论】:
-
仅供参考。
([[:alnum:]]|[[:punct:]]|)也不会匹配任何内容。 -
.*(?=S\\d{8})这个正则表达式会匹配并确保它后跟 S 后跟 8 位数字(通过正向前瞻)Demo -
是
sub(".*(S\\d{8})", "\\1", vec)你在找什么?或者说真的,前 S+8 位之前的所有内容:sub("^(.*?)S\\d{8}.*", "\\1", vec, perl=T)? (更新) -
FWIW 您使用的是负面的后视,即:这之后的内容 (?
-
如果可能有多个 Sxxxx,您可以使用非贪婪版本。如果您想摆脱 Sxxx 部分,请使用
(.*?)(?=S\d{8}).*并替换为$1
标签: regex r string regex-negation gsub