1

我正在处理地址数据并使用正则表达式来检测错误。虽然我的方法有效,但它远非高效。

首先,让我们创建一个数据集。

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。

我可以看到不正确的模式是数字后跟字母。所以,这就是我尝试过的。

方法一

try_detection$summary <- str_detect(try_detection$address, '^[:digit:]{1}[:alpha:]')

结果是只有第 3 次观察被标记。所以,我只是想我可以简单地使用'|' 并替换 {} 中的数字。

方法二

try_detection$summary <- str_detect(try_detection$address, 
                               '^[:digit:]{1}[:alpha:] | 
                                ^[:digit:]{2}[:alpha:] | 
                                ^[:digit:]{3}[:alpha:] | 
                                ^[:digit:]{4}[:alpha:] | 
                                ^[:digit:]{5}[:alpha:]')

但是所有观察结果都被标记为 FALSE。

方法三

所以,这就是我最终使用的。

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"))

虽然它可以工作并且可以更正标记不正确的地址,但它根本没有效率。请告知我如何更有效地完成工作。

4

1 回答 1

1

您可以使用

^[[:digit:]]+[[:alpha:]]

或者

^[0-9]+[[:alpha:]]

请参阅正则表达式演示

细节

  • ^- 字符串的开始
  • [[:digit:]]+/ [0-9]+- 1 个或多个(+量词匹配一个或多个出现)数字
  • [[:alpha:]]- 一封信。

注意:如果您打算只匹配开头有 1 到 5 位数字后跟一个字母的字符串,您可以替换+{1,5} 限制(或范围间隔)量词。

虽然 ICU 正则表达式允许使用裸 POSIX 字符类(如[:digit:]),但我建议在括号表达式中使用它们以使它们更便携(即[[:digit:]])。

于 2018-11-01T16:43:34.210 回答