需要帮助改进R中的正则表达式代码

时间:2018-11-01 16:41:11

标签: r regex

我正在处理地址数据,并使用正则表达式来检测错误。尽管我的方法行得通,但距离高效还很遥远。

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

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

尽管它可以工作并且可以纠正标志不正确的地址,但是它根本没有效率。请告知我如何才能更高效地完成工作。

1 个答案:

答案 0 :(得分:1)

您可以使用

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

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

请参见regex demo

详细信息

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

注意:如果您打算只匹配开头带有1到5位数字的字符串,然后加上字母,则可以将+替换为{1,5} 限制(或范围间隔)。

尽管ICU正则表达式允许使用裸露的POSIX字符类(例如[:digit:]),但我建议在方括号表达式中使用它们,以使其更具可移植性(即[[:digit:]])。