2012-11-21 66 views
3

我有字符串矢量:在一個字符串的末尾匹配特定號碼

s <- c('abc1', 'abc2', 'abc3', 'abc11', 'abc12', 
     'abcde1', 'abcde2', 'abcde3', 'abcde11', 'abcde12', 
     'nonsense') 

我想一個正則表達式匹配只與abc開始字符串,並用3結束,11,或者12 。換句話說,正則表達式必須排除abc1,但不包括abc11,abc2,但不包含abc12,依此類推。

我認爲這很容易做到前瞻斷言,但我還沒有找到辦法。有一個嗎?


編輯:感謝海報低於在原崗位指出了嚴重的不確定性。

實際上,我有很多字符串。它們都以數字結尾:一些在0,一些在9,一些在數字之間。我正在尋找一個匹配所有字符串的正則表達式,除了那些以字母后跟1或2結尾的正則表達式。(正則表達式還應該只匹配那些以abc開頭的字符串,但這是一個簡單的問題。)

我試圖使用負向視圖斷言來創建這樣一個正則表達式。但我沒有任何成功。


感謝所有回覆和評論的人。受到你們幾個人的啓發,我最終使用了這種組合:grepl('^abc', s) & !grepl('[[:lower:]][12]$', s)

回答

3

而是一個複雜的正則表達式,在這種情況下,我認爲這是更容易使用兩個簡單的正則表達式:

s <- c('abc1', 'abc2', 'abc3', 'abc11', 'abc12', 
     'abcde1', 'abcde2', 'abcde3', 'abcde11', 'abcde12', 
     'nonsense') 

s[grepl("^abc", s) & grepl("(3|11|12)$", s)] 
+0

更清晰,+1! –

3

這是你想要的嗎?

s[grepl("abc.*(3|11|12)", s)] 
[1] "abc3" "abc11" "abc12" "abcde3" "abcde11" "abcde12" 

而且排除字符串是:

s[!grepl("abc.*(3|11|12)", s)] 
[1] "abc1"  "abc2"  "abcde1" "abcde2" "nonsense" 

編輯:作爲評論表明,存在於你的要求有些含糊不清。一個更全面的正則表達式將測試字符串開始^和字符串結束$,可能只允許字母字符[[:alpha:]]最終數字之前:

s[grepl("^abc[[:alpha:]]*.*(3|11|12)$", s)] 
[1] "abc3" "abc11" "abc12" "abcde3" "abcde11" "abcde12" 

您也可以grep直接通過傳遞返回值,參數value=TRUE,從而節省了一下複製的代碼:

grep("^abc[[:alpha:]]*.*(3|11|12)$", s, value=TRUE) 
[1] "abc3" "abc11" "abc12" "abcde3" "abcde11" "abcde12" 
+0

我提出了一個輕微的修改:'grep的(S 「^ ABC *(3 | | 11 12)$」。 ,value = TRUE)'。 '^'匹配開始,'$'結束字符串,因爲OP需要。 –

+0

這也會匹配像abc33這樣的東西。 – Aust

+0

@Aust:從這個問題來看,abc33確實應該匹配(「以abc開頭並以3結尾」 - 沒有關於不以33結尾的內容)。 –

1

你可以在這種情況下使用substring太:

z <- nchar(s) 
s[substring(s, 1, 3) == "abc" & substring(s, z) == "3" | 
    substring(s, z-1) %in% c("12", "11")] 
0

爲請求的數字看具體給出了這樣的:

n <- c(3,11,12) 

s[sub('abc[^[:digit:]]*([[:digit:]]+)$',s, replacement='\\1') %in% n] 
[1] "abc3" "abc11" "abc12" "abcde3" "abcde11" "abcde12" 

這並不混淆11對於1:

n <- c(3,1,12) 

s[sub('abc[^[:digit:]]*([[:digit:]]+)$',s, replacement='\\1') %in% n] 
[1] "abc1" "abc3" "abc12" "abcde1" "abcde3" "abcde12" 

爲了您的編輯,在1或2個(使用兩個正則表達式)未結束

s[grepl('^abc',s) & !(sub('.*[^[:digit:]]([[:digit:]]+)$',s, replacement='\\1') %in% c(1,2))] 
[1] "abc3" "abc11" "abc12" "abcde3" "abcde11" "abcde12" 
相關問題