【问题标题】:Regular expression for address in RR中地址的正则表达式
【发布时间】:2017-02-13 12:10:00
【问题描述】:

我想选择以 CALLE 或 CARRERA 开头并以找到的最后一个数字结尾的匹配部分。我无法弄清楚这个正则表达式:

input1: CALLE 15 # 21-32 APARTAMENTO SEGUNDO PISO

输出 1:调用 15 # 21-32

输入 2:此字符串不匹配

输出 2:此字符串不匹配

然后用匹配的子串替换向量。但如果没有匹配的子字符串,则保持原字符串不变。

这是我尝试过的:

df$DirRes2 <- regmatches(df$DirRes2, regexpr("(CALLE.*\\d | CARRERA.*\\d | .*)", df$DirRes2))

【问题讨论】:

  • 请显示您的字符串的开始和结束位置。 ... 也是字符串的一部分吗?
  • 我编辑了,对不起。格式为 originalString ...to... resultString
  • 你能显示预期的输出吗?
  • 再次编辑。我想现在很清楚了。

标签: r regex match


【解决方案1】:

我们可以用base R 做任何一个

sub(".*((?i)(CALLE|CARRERA).*[0-9])[^0-9]+$", "\\1", str1, perl = TRUE)
#[1] "CALLE 15 # 21-32"        "THIS STRING WON'T MATCH" "Calle 25"            

或使用str_extract

library(stringr)
v1 <- trimws(str_extract(str1, "(?i)(CALLE|CARRERA)\\s*[0-9]+\\s*#*\\s*[0-9-]*"))
ifelse(is.na(v1), str1, v1)
#[1] "CALLE 15 # 21-32"        "THIS STRING WON'T MATCH" "Calle 25"     

更新

基于 OP 在 cmets 中提供的新模式,@Jota 的修改版本有效

sub(".*?((?:CALLE|CARRERA).*\\d).*$", "\\1", str2, perl = TRUE, ignore.case = TRUE) 
#[1] "CALLE 15 # 21-32"        "THIS STRING WON'T MATCH" "Calle 25"  
#[4] "CALLE 18 CARRERA 7" 

数据

str1 <- c("CALLE 15 # 21-32 APARTAMENTO SEGUNDO PISO", 
                 "THIS STRING WON'T MATCH", "Calle 25 Something")

str2 <- c(str1,  "CALLE 18 CARRERA 7 CONDOMINIO BELLO")

【讨论】:

  • # 可能丢失。字符串可以是“Calle 25 Something”,它应该输出“Calle 25”
  • 它在大多数情况下都可以正常工作,但有一个问题:“CALLE 18 CARRERA 7 CONDOMINIO BELLO”正在转向“CARRERA 7”。它应该是“CALLE 18 CARRERA 7”。有任何想法吗?抱歉,我帮不上什么忙,我完全迷路了。
  • @akrun,您可以使起始部分不贪婪以捕捉“CALLE 18 CARRERA 7”。此外,因为找到的最后一个数字可能是字符串中的最后一个字符(谁知道?),您也可以对此进行调整:".*?((?i)(CALLE|CARRERA).*[0-9]).*$"
  • 嗯...似乎对我有用。我最初尝试使用 sub(".*?((?:CALLE|CARRERA).*\\d).*$", "\\1", str1, perl = TRUE, ignore.case = TRUE),这对我也有效。
  • @Jota 抱歉,我之前忘记了perl=TRUE。它有效
猜你喜欢
  • 1970-01-01
  • 2013-01-16
  • 2011-06-20
  • 2017-03-15
  • 2015-11-22
  • 2011-04-13
相关资源
最近更新 更多