gsub:仅在两位数/字母之间保留给定字符

时间:2018-03-01 11:08:02

标签: r gsub

我有一个地址列表,我想分成两个数组:

  1. 地址行(两个字母之间保留特殊字符,如“ - ” - c.f。text.2
  2. 门牌号码(两位数之间保留特殊字符,如“ - ”)
  3. 以下是一个例子:

    text.1 <- "CALLE COMPOSITOR LEHMBERG RUIZ 19-21"
    text.2 <- "CALLE COMPOSITOR LEHMBERG-RUIZ 19-21"
    

    要提取门牌号码,我尝试使用gsub("[^0-9\\-]", "", x)text.1适用text.2,但效果不如> gsub("[^0-9\\-]", "", text.1) [1] "19-21" > gsub("[^0-9\\-]", "", text.2) [1] "-19-21"

    gsub("[0-9]", "", x)

    要提取我使用ifelse( substr( gsub("[^0-9\\-]", "", x ), 1, 1 ) == "-" , substr( gsub("[^0-9\\-]", "", x), 2, nchar( gsub("[^0-9\\-]", "", x) ) ) , gsub("[^0-9\\-]", "", x) ) 的地址行,会产生类似的问题。

    我可以使用以下代码解决此问题:

    "19-21"

    x = text.1x = text.2产生gsub。但是,正如人们可以说它不是很优雅。

    我的问题是,如果有一种“优雅”的方式来解决这个问题(例如以更聪明的方式使用componentDidMount() { this.props.loadClient(); // dispatch an action from your component } )?

2 个答案:

答案 0 :(得分:2)

当模式为true时,我们可以使用正则表达式SKIP并删除所有其他字符

gsub("(\\d+)-(\\d+)(*SKIP)(*F)|.", "", text.1, perl = TRUE)
#[1] "19-21"
gsub("(\\d+)-(\\d+)(*SKIP)(*F)|.", "", text.2, perl = TRUE)
#[1] "19-21"

答案 1 :(得分:1)

我建议在你的情况下使用str_extract而不是gsub。你可以这样:

library(stringr)
str_extract(text.1,"[0-9]{1,3}\\-[0-9]{1,3}")
[1] "19-21"
str_extract(text.2,"[0-9]{1,3}\\-[0-9]{1,3}")
[1] "19-21"

str_extract(text.1,"[^0-9][A-Z\\-\\s]+")
[1] "CALLE COMPOSITOR LEHMBERG RUIZ "
str_extract(text.2,"[^0-9][A-Z\\-\\s]+")
[1] "CALLE COMPOSITOR LEHMBERG-RUIZ "