正则表达式字符串,以获取一个数字旁边的字母

时间:2014-11-30 23:14:24

标签: regex r

在R中,我想使用grep或'grepl'或'gsub'命令查找字符串向量中的所有元素,这些元素具有A道路或M道路或B道路名称在它..

请参阅下面的示例

tmp <- c('Little Street','A323', 'Essex Road (A43)', 'M43','Orange street','M4','B2045','New Street')

我想要一个函数返回......

c('Minor Road','A Road', 'A Road', 'M Road', 'Minor Road', 'M Road','B Road','Minor Road')

我的第一个想法是使用像

这样的东西
grepl('[0-9]',tmp)

但这无法区分A路,B路和M路......

一如既往,我们将非常感谢任何帮助......

4 个答案:

答案 0 :(得分:5)

这个怎么样

tmp <- c('Little Street','A323', 'Essex Road (A43)', 'M43','Orange street','M4','B2045','New Street')

road <- rep("Minor", length(tmp))
m <- regexpr("\\b[ABM]\\d+", tmp)
road[m!=-1] <- substr(regmatches(tmp, m),1,1)
paste(road, "Road")

我们使用regmatches()regexpr()来查找和提取A,B或M,然后再添加一个字母

答案 1 :(得分:3)

您可以使用greplsub ...

将其细分为多个步骤
> tmp[!grepl('[ABM]\\d', tmp)] <- 'Minor Road'
> sub('.*([ABM])\\d.*', '\\1 Road', tmp)
# [1] "Minor Road" "A Road"     "A Road"     "M Road"     "Minor Road"
# [6] "M Road"     "B Road"     "Minor Road"

答案 2 :(得分:1)

这可以在一个strapply语句中完成,该语句为每个输入组件返回字母后跟" Road",后面跟一个数字。对于任何不匹配的组件,请使用"Minor Road"

library(gsubfn)

strapply(tmp, "(\\D)\\d", ~ paste(x, "Road"), empty = "Minor Road", simplify = TRUE)

,并提供:

[1] "Minor Road" "A Road"     "A Road"     "M Road"     "Minor Road"
[6] "M Road"     "B Road"     "Minor Road"

更新:简化回答一个语句。

答案 3 :(得分:0)

使用rex可能会使这类任务变得更简单。

tmp <- c('Little Street','A323', 'Essex Road (A43)', 'M43','Orange street','M4','B2045','New Street')

library(rex)
classify_road <- function(x) {
  res <- re_matches(x,
    rex(
      capture(name = "type",
        upper
      ),
      digit
    )
  )

  res$type[ is.na(res$type) ] <- "Minor"
  paste(res$type, "Road")
}

classify_road(tmp)
#>[1] "Minor Road" "A Road"     "A Road"     "M Road"     "Minor Road"
#>[6] "M Road"     "B Road"     "Minor Road"