簡體   English   中英

需要幫助改進 R 中的正則表達式代碼

[英]Need Help Improving Regular Expression Code in R

我正在處理地址數據並使用正則表達式來檢測錯誤。 雖然我的方法有效,但離高效還很遠。

首先,讓我們創建一個數據集。

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

盡管它可以工作並且可以更正標志不正確的地址,但它根本沒有效率。 請建議我如何更有效地完成工作。

您可以使用

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

或者

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

請參閱正則表達式演示

細節

  • ^ - 字符串的開始
  • [[:digit:]]+ / [0-9]+ - 1 個或更多( +量詞匹配一個或多個出現)數字
  • [[:alpha:]] - 一個字母。

注意:如果您打算只匹配開頭有 1 到 5 位數字后跟一個字母的字符串,您可以將+替換為{1,5}限制(或rangeinterval )量詞。

盡管 ICU 正則表達式允許使用裸 POSIX 字符類(如[:digit:] ),我建議在括號表達式中使用它們以使它們更易於移植(即[[:digit:]] )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM