【问题标题】:regex - excluding a specific part of an URL via regex match in gsub正则表达式 - 通过 gsub 中的正则表达式匹配排除 URL 的特定部分
【发布时间】: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 上尝试了各种解决方案,但无济于事。一些例子:

  • (?&lt;!S\d) - 这留下第二个数字
  • (?&lt;!S[[:digit:]]) - 一样

我想要实现的目标可以简单概括:*匹配所有内容,直到找到大写字母S和之后的8位数字

注意事项

我想通过gsubregex 得到解决方案我不想使用:

  • 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


【解决方案1】:

你可以得到结果使用

sub(".*(S\\d{8})", "\\1", vec)

demo

使用.*,我们匹配任意数量的(* - 0 或更多)任何字符,但换行符直到 S 后跟 8 位数字 (S\\d{8})。由于(S\\d{8}) 在未转义的括号内,因此与此子模式匹配的子字符串被放入捕获组#1。使用\\1 反向引用,我们在结果中恢复捕获的文本。

在regular-expressions.info 上查看有关backreferencescapturing groups 的更多信息。

注意:如果S+8 digits后面有更多文字,可以使用

sub("^.*(S\\d{8}).*$", "\\1", vec)

【讨论】:

  • 为什么使用 [\s\S] 而不仅仅是 . ?由于两者是互补的,因此正则表达式似乎过于复杂
  • @Tensibai:这是真的。我只是更习惯于基于 PCRE 的正则表达式,其中 . 在不设置单行模式的情况下不匹配换行符。
  • 确实,它需要在正则表达式的开头使用多行修饰符。但我认为它使它更具可读性。
  • @Tensibai:感谢您的评论,我删除了不必要的替代解决方案以避免任何混淆。
【解决方案2】:

这里的语法稍微漂亮一点:

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)

【讨论】:

  • 它的可读性确实很高,但需要相当多的库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多