2016-03-16 115 views
2

我正在努力獲得一些正則表達式代碼來工作。我有一長串我需要部分提取的字符串。我只需要以「WER」開頭的字符串,而且我只需要在字母上開始(包括)字符串的最後部分。使用正則表達式提取字符串的一部分

test <- c("abc00012Z345678","WER0004H987654","WER12400G789456","WERF12","0-0Y123") 

下面是一行正在工作但只有一個字母的代碼行。但是在我的字符串列表中可以有任何字母。

ifelse(substr(test,1,3)=="WER",gsub("^.*H.*?","H",test),"") 

什麼我希望能實現如下:

H987654 
G789456 
F12 

回答

5

您可以使用以下方式與gsub

> gsub("^(?:WER.*([a-zA-Z]\\d*)|.*)$", "\\1", test) 
[1] ""  "H987654" "G789456" "F12"  "" 

regex demo

這種模式匹配:

  • ^ - 串的開始
  • (?: - 交替組的開始與2個備選方案:
    • WER.*([a-zA-Z]\\d*) - WER炭序列,隨後用任何0+字符(.*)儘可能多地到最後一個字母([a-zA-Z])後跟0+數字(\\d*)(用\\d+代替以匹配1+數字,要求至少1位數)
    • | - 或
    • `* - 任何0+字符
  • )$ - 關閉的交替組和匹配串與$結束。

隨着str_matchstringr,甚至更加整潔:

> library(stringr) 
> res <- str_match(test, "^WER.*([a-zA-Z]\\d*)$") 
> res[,2] 
[1] NA  "H987654" "G789456" "F12"  NA  
> 

another regex demo

如果有新行輸入,在模式的開頭添加(?s)res <- str_match(test, "(?s)^WER.*([a-zA-Z]\\d*)$")

+1

完美謝謝。 – PatraoPedro

+0

Just FYI:'「^。* H。*?」'匹配從開始到最後一個字符串的整個字符串,然後以'。*?'結尾不會消耗/返回任何字符(因爲它是一個懶惰的子模式,可以匹配一個空字符串,所以它匹配'H'後面的空白位置並稱它爲一天)。 'gsub'將這個匹配的塊替換爲「H」。 –

3

如果你不想空字符串或NA爲不以「WER」開頭的字符串,你可以試試下面的辦法:

sub(".*([A-Z].*)$", "\\1", test[grepl("^WER", test)]) 
#[1] "H987654" "G789456" "F12" 
相關問題