【问题标题】:Need Help Improving Regular Expression Code in R需要帮助改进 R 中的正则表达式代码
【发布时间】:2018-11-02 00:43:34
【问题描述】:

我正在处理地址数据并使用正则表达式来检测错误。虽然我的方法有效,但离效率还差得很远。

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

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。

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

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

【问题讨论】:

    标签: r regex


    【解决方案1】:

    你可以使用

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

    或者

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

    请参阅regex demo

    详情

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-30
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      相关资源
      最近更新 更多