2016-12-02 87 views
1

我有所謂的「面子」文件名看起來像這樣的列表中提取匹配的字母索引:基於R從字符串

cK0521d07.png 
ck0101a02.png 
ck0221c01.png 
ck0121b01.png 
ck0221g08.png 
ck0321c22.png 

所有我關心的是信中的CK後馬上跟隨四位數字(不區分大小寫)。例如,我想這些索引所在的盤符是C,所以我所做的就是:

grep("([:alnum:]{6})c([:digit:]{2}).png", Face) 

我預想R返回3和6我,而是,它返回整數(0) 。我必須做錯事,但我不知道它是什麼。請有人告訴我,這會很有幫助。謝謝!

+0

注意對於那些誰想要接近一個錯字:剛剛殺青'album'到'alnum'沒有固定的正則表達式。點也必須逃脫,錨點可能需要添加。 –

+0

謝謝Wiktor!我剛糾正了這個錯字。我很確定我在編碼時輸入了「alnum」。順便說一下,我通過'grep(「。+ c。+」,Face)'解決了這個問題,但是知道POSIX類的工作方式仍然很棒! – ytu

回答

1

這些POSIX字符類必須位於[](括號表達式)中。使用

"[[:alnum:]]{6}c[[:digit:]]{2}\\.png" 

regex demo

必要時,添加錨(^在開始和$末)到整個字符串相匹配。

請注意,點必須轉義以匹配文字點,否則它會匹配任何字符。

Face <- c("cK0521d07.png","ck0101a02.png","ck0221c01.png","ck0121b01.png","ck0221g08.png","ck0321c22.png") 
grep("[[:alnum:]]{6}c[[:digit:]]{2}\\.png", Face) 
## => [1] 3 6 

R demo online

+0

謝謝你Wiktor!您的解決方案完美運作「:album:」是一個自動更正,當我發佈這個問題時我沒有注意到。儘管我有兩個新產生的問題。 首先,**這些POSIX類是否需要兩對括號,或者這些類本身是否包含一對括號?** 另外,我知道反斜槓是R中的轉義字符,但**爲什麼不是「 \\「。部分在字面點之前引起一個額外的反斜槓?** – ytu

+0

正如我寫的,像'[:punct:]'或'[:alnum:]'這樣的POSIX字符類必須位於括號表達式內部,您可以編寫'[[:alpha :] [:digit:]]'匹配與[[:alnum:]]'相同的字符。 ''\\。「'定義了一個'\ .'字符串,一個文字反斜槓和一個點,並且該模式與輸入字符串中的一個文字點相匹配。 –