我正在处理地址数据,并使用正则表达式来检测错误。尽管我的方法行得通,但距离高效还很遥远。
首先,让我们创建一个数据集。
try_detection <- data.frame(address = c('444+MLK+Street',
'444+3rd+Avenue',
'5th+MLK+Avenue',
'55th+MLK+Avenue',
'555th+MLK+Avenue',
'5555th+MLK+Avenue',
'55555th+MLK+Avenue'),
stringsAsFactors = FALSE)
仅有的前2个观察结果是正确的,因为它以地址号开头。目标是将前2个观察结果标记为FALSE,其余观察结果为TRUE。
我可以看到错误的模式是数字,然后是字母。所以,这就是我尝试过的。
方法1
try_detection$summary <- str_detect(try_detection$address, '^[:digit:]{1}[:alpha:]')
结果仅标记了第三个观察值。所以,我以为我可以简单地使用'|'并替换{}中的数字。
方法2
try_detection$summary <- str_detect(try_detection$address,
'^[:digit:]{1}[:alpha:] |
^[:digit:]{2}[:alpha:] |
^[:digit:]{3}[:alpha:] |
^[:digit:]{4}[:alpha:] |
^[:digit:]{5}[:alpha:]')
但是所有观察结果都被标记为FALSE。
方法3
所以,这就是我最终使用的。
try_detection$detect1 <- str_detect(try_detection$address, '^[:digit:]{1}[:alpha:]')
try_detection$detect2 <- str_detect(try_detection$address, '^[:digit:]{2}[:alpha:]')
try_detection$detect3 <- str_detect(try_detection$address, '^[:digit:]{3}[:alpha:]']
try_detection$detect4 <- str_detect(try_detection$address, '^[:digit:]{4}[:alpha:]')
try_detection$detect5 <- str_detect(try_detection$address, '^[:digit:]{5}[:alpha:]')
try_detection <- try_detection %>% mutate(summary =
ifelse(detect1 == TRUE |
detect2 == TRUE |
detect3 == TRUE |
detect4 == TRUE |
detect5 == TRUE, "Y", "N"))
尽管它可以工作并且可以纠正标志不正确的地址,但是它根本没有效率。请告知我如何才能更高效地完成工作。
答案 0 :(得分:1)
您可以使用
^[[:digit:]]+[[:alpha:]]
或
^[0-9]+[[:alpha:]]
请参见regex demo。
详细信息
^
-字符串的开头[[:digit:]]+
/ [0-9]+
-1个或多个(+
量词匹配一个或多个匹配项)数字[[:alpha:]]
-一封信。 注意:如果您打算只匹配开头带有1到5位数字的字符串,然后加上字母,则可以将+
替换为{1,5}
限制(或范围,间隔)。
尽管ICU正则表达式允许使用裸露的POSIX字符类(例如[:digit:]
),但我建议在方括号表达式中使用它们,以使其更具可移植性(即[[:digit:]]
)。